RecyclerView的ViewHolder复用错乱问题处理

关于RecyclerView复用错乱问题的处理方法网上大部分是以下几种

1.最简单直接的方法ViewHolder不可复用(尽量不要使用此方法)

viewHolder.setIsRecyclable(false)

2.在onBindViewHolder里给View设置展示前,都需要将当前View的状态置为初始状态,其中if里设置的一定要在else里还原。 (注意此处的item为数据模型的字段,尽量使用数据模型内字段来区分要展示)

if(item.isChecked){
    textView.setText("展示");
}else{
    textView.setText("收起");
}

3.通过onBindViewHolder中的position或者viewHolder的getAdapterPosition来判断展示。

4.通过设置Tag来判断展示

5.如果是onBindViewHolder没有被调用,尝试是不是没重写getItemViewType导致。

@Override
public int getItemViewType(int position) {
    return position;
}

        再没被调用可以尝试调整 RecyclerView 的复用逻辑和方式来解决 onBindViewHolder 没有调用的这个问题。 

recyclerView.setItemViewCacheSize(int) 

6.以上方法都不管用的话,可以检查下是否在onBindViewHolder使用了异步回调改变View状态,而在异步回来之前Adapter调用了notifyDataSetChanged()等刷新方法导致ViewHolder被刷新复用导致。如果是这种情况,需要保证避免异步回来之前刷新即可解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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复用机制不会导致更改字体颜色失效的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Yvan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值