RecyclerView ViewHolder复用错乱解决方案

【前言】

     一般而言,要是RecyclerView.AdaptergetItemViewType方法返回相同值时,RecyclerView就会复用已经滑出屏幕变为不可见的ViewHolder,假如被复用的ViewHolder持有的View没有被重新赋值或者恢复原始状态,就会出现显示被复用之前的View状态的这种现象,我们可以认为出现RecyclerView ViewHolder复用出现错乱

【复用错乱解决方案】

1)方案一:直接在RecyclerView.Adapter的onBindViewHolder方法里设置:

holder.setIsRecyclable(false);

加了这个设置,不管getItemViewType是否返回相同值,一概都不复用ViewHolder,网上一搜基本都是说这种方案,这个方案是挺简洁,但是也很致命,因为这样在滑动过程中会不断创建新的对象,要是RecyclerView的item图片比较多,那么很容易就会出现OOM内存溢出
2)方案二:在onBindViewHolder方法里面对ViewHolder持有的所有view都按需重新赋值或者恢复初始状态,比如:

  • TextView、ImageView该重新赋值就重新赋值,要是异步请求,可以先赋默认值,设置默认图片
  • 该隐藏的布局或者设置宽高的,也按传进来的对象值设置好,总之不要漏掉没有设置的View或者宽高、可见性属性,就不会出现错乱问题

推荐用第二种方案处理,这种才是治标又治本的方法

【备注】

    当 RecyclerView 的条目很少的时候,比如只有6个,将 RecyclerView 从上滑动到下,这个时候是正常的,onBindViewHolder 会调用,不过此时从底部上滑的时候,上方的 item 从不可见到可见的这个过程中,onBindViewHolder 并没有调用,这个时候我也就没办法进行一些刷新 item 的操作了。
这个问题的原因是 onBindViewHolder 方法不调用导致的, StackOverflow的解决方案
你可以调用

recyclerView.setItemViewCacheSize(int);
RecyclerViewViewHolder复用机制是其高效的一个特点,即每次滑动RecyclerView时,不会创建新的ViewHolder,而是重复利用已经创建过的ViewHolder,以避免性能问题。然而,这种复用机制可能会产生一些问题,例如在更改字体颜色时,有时可能无法生效。这是为什么呢? 其实,ViewHolder复用机制的本质是重用View而不是ViewHolder,ViewHolder只是用来保存已经创建的View,以便快速访问。当滑动RecyclerView时,如果ViewHolder已经存在,则会直接调用它的bind方法,将新的数据绑定到它的View上。如果ViewHolder不存在,则会调用其create方法来创建ViewHolder和View。这些已经被创建的View将被存储在RecyclerView的内存池中,以供下一次调用时重用。 因此,在更改字体颜色时,可能由于ViewHolder和View已经被创建过,但其颜色设置仍然保留在内存池中,这导致新的颜色设置被覆盖或无法生效。为了解决这个问题,我们可以在bind方法中显式地更改字体颜色,以确保它被正确更新。同时,我们需要确保每次ViewHolder复用时都正确地更新所有的View。这就需要我们在创建ViewHolder时,对所有的View进行初始化,确保每个View的颜色都被正确设置。 综上所述,我们需要在bind方法中显式地更改字体颜色,并在ViewHolder创建时对所有View进行正确的初始化,以确保RecyclerViewViewHolder复用机制不会导致更改字体颜色失效的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值