深入浅出Android开发基础教程

更新:10-29 神话故事 我要投稿 纠错 投诉

大家好,关于深入浅出Android开发基础教程很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

浏览器渲染.png--------------本文将以联系人界面为例,实现多Item布局的RecyclerView------------- -

RecyclerView实现多种Item布局

首先编写一个Activity、RecyclerView布局、自定义Adapter、以及两个Item布局;定义几个ViewHolder来获取对应Items中的控件;在自定义适配器中定义几个常量作为多个Item布局入口的开关;重写RecyclerView的getItemViewType方法,根据返回的常量标记对应的Item布局;在Adapter重写的onCreateViewHolder方法中根据viewType类型绑定对应的Item布局,并返回对应的ViewHolder;在Adapter 重写的onBindViewHolder 方法中,根据持有者的不同类型来绑定数据。

2. 定义ViewHolder

本示例实现了两种不同类型的Item布局,因此需要自定义两个ViewHolder,并根据ViewHolder中的Id获取各自Item布局中的控件;

类FirstViewHolder(视图: 视图) : RecyclerView.ViewHolder(视图){

var contactImg1 : 图像视图?=空

var contactName1 : 文本视图?=空

初始化{

contactImg1=view.findViewById(R.id.contact_item_img)

contactName1=view.findViewById(R.id.contact_item_name)

}

}

类SecViewHolder(视图: 视图) : RecyclerView.ViewHolder(视图){

var contactImg2 : 图像视图?=空

var contactName2 : 文本视图?=空

初始化{

contactImg2=view.findViewById(R.id.contact_item_img_2)

contactName2=view.findViewById(R.id.contact_item_name_2)

}

}

3. 在自定义adapter中定义常量

这里定义的常量主要作为重写getItemViewType方法的判断条件,即在什么情况下显示哪个Item布局;

val FIRST_ITEM : 整数=1

val SEC_ITEM : Int=2

4. 重写RecyclerView的getItemViewType方法

根据返回的常量标记要在相应位置显示的Item 布局。例如,当添加的Item的位置是3的倍数时,使用第二种Item布局;

覆盖fun getItemViewType(position: Int): Int {

if(位置% 3==0){

返回SEC_ITEM

}别的{

返回FIRST_ITEM

}

}

5. onCreateViewHolder方法中根据viewType类型绑定对应的ViewHolder;

根据参数viewType,可以知道当前位置应该放置哪种类型的Item布局。例如,当viewType为FIRST_ITEM时,返回item1绑定的布局,否则返回item2绑定的布局;

覆盖乐趣onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

如果(视图类型==第一个项目){

返回FirstViewHolder(LayoutInflater.from(context).inflate(R.layout.addressbook_contact_item_1,parent,false))

}别的{

返回SecViewHolder(LayoutInflater.from(context).inflate(R.layout.addressbook_contact_item_2,parent,false))

}

}

6. onBindViewHolder方法中根据不同类型的holder绑定数据

Kotlin语言编写方法:

(1)首先需要调用getItemViewType方法获取当前位置的Item类型;

(2)根据Item类型获取对应的ViewHolder,然后利用ViewHolder来更新Item对应类型中控件的数据显示;覆盖fun onBindViewHolder(holder: RecyclerView.ViewHolder,position: Int) {

var mContactItem=mContactList[位置]

val myViewType=getItemViewType(位置)

当(myViewType){

第一个项目-{

持有者作为FirstViewHolder

holder.contactImg1?setImageResource(mContactItem.contactImgId)

holder.contactName1?text=mContactItem.contactName

}

SEC_ITEM-{

持有者作为SecViewHolder

holder.contactImg2?setImageResource(mContactItem.contactImgId)

holder.contactName2?text=mContactItem.contactName

}

}

}Java语言写法:Java写法不需要调用getItemViewType方法来获取当前位置的Item类型。直接通过instanceof进行类型检查,获取对应的Item类型;在通过holder调用Item中的控件之前,需要在holder实例之前指明是哪一个。 ViewHolder 类的实例。 if(FirstViewHolder 的持有者实例) {

((FirstViewHolder)holder).contactName1?setText(mContactItem.contactName);

}别的{

((SecViewHolder)holder).contactName2?setText(mContactItem.contactName);

}---------------------自定义Adapter中完整代码及效果图如下---------------- - ----------

recyclerView实现多个Item布局的渲染完整代码class AddressBookAdapter(val context : Context) : RecyclerView.Adapter() {

私有var mContactList=ArrayList()

val FIRST_ITEM : 整数=1

val SEC_ITEM : 整数=2

公共乐趣setContactList(contactList : ArrayList){

this.mContactList=联系人列表

通知数据集更改()

}

类FirstViewHolder(视图: 视图) : RecyclerView.ViewHolder(视图){

var contactImg1 : 图像视图?=空

var contactName1 : 文本视图?=空

初始化{

contactImg1=view.findViewById(R.id.contact_item_img)

contactName1=view.findViewById(R.id.contact_item_name)

}

}

类SecViewHolder(视图: 视图) : RecyclerView.ViewHolder(视图){

var contactImg2 : 图像视图?=空

var contactName2 : 文本视图?=空

初始化{

contactImg2=view.findViewById(R.id.contact_item_img_2)

contactName2=view.findViewById(R.id.contact_item_name_2)

}

}

覆盖fun getItemViewType(position: Int): Int {

if(位置% 3==0){

返回SEC_ITEM

}别的{

返回FIRST_ITEM

}

}

覆盖乐趣onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

如果(视图类型==第一个项目){

返回FirstViewHolder(LayoutInflater.from(context).inflate(R.layout.addressbook_contact_item_1,parent,false))

}别的{

返回SecViewHolder(LayoutInflater.from(context).inflate(R.layout.addressbook_contact_item_2,parent,false))

}

}

覆盖fun onBindViewHolder(holder: RecyclerView.ViewHolder,position: Int) {

var mContactItem=mContactList[位置]

val myViewType=getItemViewType(位置)

当(myViewType){

第一个项目-{

持有者作为FirstViewHolder

holder.contactImg1?setImageResource(mContactItem.contactImgId)

holder.contactName1?text=mContactItem.contactName

}

SEC_ITEM-{

持有者作为SecViewHolder

holder.contactImg2?setImageResource(mContactItem.contactImgId)

holder.contactName2?text=mContactItem.contactName

}

}

}

重写fun getItemCount(): Int=mContactList.size

用户评论

伤离别

对Android零基础想学习的朋友非常实用!

    有5位网友表示赞同!

铁树不曾开花

终于找到一些基础学习资源了,之前一直不知道怎么入手。

    有8位网友表示赞同!

别在我面前犯贱

想要试试开发Androidapp,这篇文章应该很有帮助吧。

    有12位网友表示赞同!

凉月流沐@

学习Android的起点从这里开始吗?

    有17位网友表示赞同!

轨迹!

内容全面精炼,适合新手入门学习。

    有20位网友表示赞同!

弃我者亡

期待深入了解Android的运作机制!

    有12位网友表示赞同!

命该如此

感觉这个标题很吸引人,要赶紧去看看了。

    有15位网友表示赞同!

一尾流莺

Android基础知识点很重要啊,这篇文章肯定能帮我补上漏洞。

    有18位网友表示赞同!

从此我爱的人都像你

希望能涵盖一些常用的组件和开发技巧。

    有18位网友表示赞同!

涐们的幸福像流星丶

学习Android编程是我的一个小目标,这篇文章可以帮助我实现!

    有10位网友表示赞同!

男神大妈

终于有时间学习Android了,看到这个标题很期待!

    有6位网友表示赞同!

毒舌妖后

想从零开始学安卓开发,这篇基础之应该就是起点吧?

    有6位网友表示赞同!

在哪跌倒こ就在哪躺下

作为安卓小白,这篇攻略太棒了!

    有11位网友表示赞同!

不离我

希望能用通俗易懂的方式讲解,适合新手理解。

    有8位网友表示赞同!

旧爱剩女

学习Android开发需要哪些基本知识啊?这篇文章能给我答案吗?

    有11位网友表示赞同!

杰克

这个标题很明确,期待深入的讲解和案例分析。

    有15位网友表示赞同!

﹏櫻之舞﹏

想要在手机上开发自己的App,需要掌握这些基础知识吧?

    有8位网友表示赞同!

心悸╰つ

希望有更多具体的教程和代码示例!

    有11位网友表示赞同!

不识爱人心

Android的基础知识篇应该有很多学习者想了解

    有19位网友表示赞同!

蝶恋花╮

看完这篇文章后,是不是就能开始开发Android App 了?

    有17位网友表示赞同!

【深入浅出Android开发基础教程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:U盘故障与容量减少问题解析 下一篇:深度评测:4K高清全面屏壁纸精选,体验全面解析