使用RecyclerView
,我们必须知道RecyclerView
的复用机制,本文不谈复用机制原理,只谈RecyclerView
复用机制必须了解的知识点。
【知识点一】
在上层代码中,如何控制复用功能
在我们编写RecycleView的Adapter类时,必须回调以下方法
@Override
public int getItemViewType(int position) {
return position;
}
getItemViewType
方法的返回值可以控制是否开启复用功能。
一个RecycleView组件有多个Item,每个Item都有其特有类型,getItemViewType
方法可以控制Item的类型。
当它的返回值为position时,表明所有的Item的类型都不同,由于只有相同类型的Item才可以复用
,所以如果它的返回值为position时,默认认为RecyclerView
的复用机制是关闭的,否则复用机制开启。
【知识点二】
复用机制的缓存有多大?
假设getItemViewType
方法的返回值为0,如下:
@Override
public int getItemViewType(int position) {
return 0;
}
也就是说,RecyclerView
所有的Item类型都一样。
如图所示,RecyclerView
列表中,能被肉眼看到的Item数量为10,那么,可以确定,在当前设备(手机)上,RecyclerView
的复用缓存大小为10,这10个Item可以被无限复用,在设备缓存中,永远存在10个RecyclerView.ViewHolder
对象,当滑动,增加,删除时,会有新的Item显示在屏幕上,当前缓存大小还是10。
【知识点三】
凡是出现Item紊乱问题都是RecyclerView复用机制有关
当使用RecyclerView
组件时,为了性能优化,我们一般不会将getItemViewType
的返回值设置成position,如果RecyclerView
的Item只有一种类型,直接将返回值写成任意一个固定数字即可,如下:
@Override
public int getItemViewType(int position) {
return 0;
}
如果是多类型,就会写成如下代码:
@Override
public int getItemViewType(int position) {
if(a){
return 0;
}else if(b){
return 1;
}else{
return 2;
}
}
至于多类型的RecyclerView不是本文重点,多类型的RecyclerView会在后续文章中给出。
放弃使用复用机制
的话(返回值为position)不会出现Item紊乱问题,但是一旦使用了复用机制,那么将有可能偶现Item紊乱问题。
出现紊乱的原因是:当进行删除Item,下拉,新增Item等三个操作时,新的Item会显示在设备屏幕上,此时,恰恰因为代码问题,导致发生Item的紊乱现象。
至于怎么解决紊乱问题,请看下篇文章。
[本章完...]
网友评论