这几天在做一个聊天功能,由于两人对话的那个聊天页面有七种布局,写起来很繁琐,特地总结一下,顺便给大家讲一下getview。
下面上代码:
自定义适配器 继承 BaseAdapter 复写 四个方法,大家很熟悉是吧 。通过构造函数将数据源data 传递过来,此处定义的handler是用来抛出数据给 Activity 进行页面刷新的。73 76 行后面会降到。
89-99 行略过,重点讲解 101 开始:我们要加载多种布局必须重写该方法。msg 为 获取的数据,Type 为后台传递过来的类型,我们根绝类型去家在不同的布局。此时为什么要定义type=0呢,因为该方法的源码 默认是从 0 开始的(很重要)也就是返回类型要从0开始。105 -122行 是自行定义的方法 用来判断是登录者发出的信息还是接受者发出的,这个也就是用来判断加载左布局还是右布局,下面的 type=1,2,3,4,5,6,7。。是用来判断加载几种布局。我这个里面是加载7种布局,理论上来讲聊天页面左侧发的纯文字和右侧的纯文字可以写成一种布局也可以写成两种布局,我写成了一种,因为上面根绝105 行可以进行判断是加载哪个布局。这里不再赘述。
135 行 返回的 是 加载几种布局,因为我的是其中布局,你写大于7的数子即可,记得 不能小于7 负责会造成数组越界异常。
我们都知道getview 是获取 每一项的 listview 的 item控件进行绘制,安卓为我们提供了复用的一个机制,就是自己定义viewholder 来惊醒 布局的重新使用,负责一万个数据你难道要画上一万个布局么,这个不现实。
开始加载布局的时候 我们根绝type 去进行加载布局的viewholder,加载布局,绑定控件,为该布局设置tag,好为后面的复用打下基础,这个type 一定要从 0 开始 ,上面提到过。系统规定的。
244 行开始 是用来复用 那七个布局的,这个 跟有一个布局的是一样的。不再赘述。
这个是负责来写一些所对应布局的业务逻辑和赋值,所有布局逻辑你想写什么就写什么。简单吧。
最后记得 rentun converivew ,负责会崩溃。下面是定义的viewholder 没什么可说的。
public class ViewHolderMsgLeft{
//头像
publicImageViewimageViewPic;
//信息内容
publicTextViewtextViewMsg;
//发消息时间
publicTextViewtextViewTime;
//图片
publicImageViewimageViewChat;
}
public class ViewHolderMsgRight{
//头像
publicImageViewimageViewPic;
//信息内容
publicTextViewtextViewMsg;
//发消息时间
publicTextViewtextViewTime;
//图片
publicImageViewimageViewChat;
}
总结:复写getItemViewType方法和getViewTypeCount方法,在getItemViewType方法里面进行布局的判断加载,记得一定要从0 开始且不可以放在getview里面去判断负责会出现布局错乱的问题。getview方法里面记住要复用布局和主义效率。
下面分析下getview
一、ConvertView回收机制
工作原理:
1、ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
2、一个新的视图被返回并显示
如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler(缓存视图)中。
ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。 以上摘自《ListView中getView的原理+如何在ListView中放置多个item》
举例:lsitview在初始化时,整个屏幕能放下10个ITEM,所以会创建10个全新的convertView。当我往下拉一个ITEM,出现第11个ITEM的时候,第一个item布局看不到了,就会回收第一个ITEM的convertView给第11个,这就显而易见了。每次运行getView获取当前ITEM时,都会重新new 一个viewHolder与R.layout.item绑定,也就是说,每次都会产生一个新布局赋值给convertView让其显示。而超出显示范围的item布局会被回收,我们不用重新new 一个 出来 这样就提高了效率。
希望这篇文章帮助到了您。