高级UI

RecyclerView<第三篇>:怎样防止Item紊乱现象

2019-10-23  本文已影响0人  NoBugException

在大型项目中,由于逻辑混杂,有时候因为代码问题导致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返回的是固定值时,解决紊乱的问题必须从数据处理着手。

[本章完...]

上一篇下一篇

猜你喜欢

热点阅读