在大型项目中,由于逻辑混杂,有时候因为代码问题导致
RecyclerView
的Item紊乱,那么该怎么从杂乱的代码中解决Item紊乱问题呢?
【解决方案一】
adapter中有一个getItemViewType
方法,将这个方法的返回值改成position就可以做到100%防止Item紊乱问题,原理是:列表中所有Item的view类型都不同,可以保证在任何时候都能执行onBindViewHolder,也就是;
@Override
public int getItemViewType(int position) {
return position;
}
但是如果真的这样做,就失去了Recyclerview Item复用的特性,这样消耗的内存也是非常大的。如果您能够保证Recyclerview的数据量比较少,那么这个方法倒是不错的。
【解决方案二】
有时候Recyclerview加载的数据量是比较多的,显然这时将getItemViewType
的返回值改成position将大大影响性能。那么我们将它的返回值改成0或者默认的固定值,即所有的Item的类型一致,所有的IItem都可以用来复用,大大减少了内存的消耗,但是这种情况代码稍微写的不恰当就容易导致Item紊乱问题,解决这个问题还需要从代码入手。
@Override
public int getItemViewType(int position) {
return 0;
}
场景1:加载本地图片(或网络图片)
在onBindViewHolder中的写法如下
if(图片存在){
//加载已存在的图片
}
场景2:姓名展示
在onBindViewHolder中的写法如下
if(存在姓名){
//加载已存在的姓名
}
如果getItemViewType返回的是固定值时,基本上可以确定这两种场景都会发生100%紊乱,解决方案如下:
场景1:加载本地图片(或网络图片)
在onBindViewHolder中的写法如下
if(图片存在){
//加载已存在的图片
}else{
//加载默认的图片
}
场景2:姓名展示
在onBindViewHolder中的写法如下
if(存在姓名){
//加载已存在的姓名
}else{
//加载默认的姓名
}
也就是说,如果getItemViewType返回的是固定值时,解决紊乱的问题必须从数据处理着手。
[本章完...]
网友评论