解决RecyclerView删除或插入数据导致position错乱引起的数据错乱和位置错乱问题

Recyclerview删除或者插入数据需要同步刷新列表一般会用到

notifyDataSetChanged();
notifyItemInserted(position)
notifyItemRemoved(position)

当使用

notifyItemInserted(position)
notifyItemRemoved(position)

会导致ViewHolder的position出现错误,比如有五条数据,当你删掉第二条,那么你理所当然以为后面的条目position会往前跳变成123(position由0开始),然而事实并不是,上面两条代码只是局部刷新,其他的ViewHolder并不会更新

当然解决方法很简单,使用notifyDataSetChanged();或者其他类似notifyItemRangeInserted();这种范围性刷新的就行,但是这些方法会导致Recyclerview闪烁,不想闪烁就只能关闭动画。

当然如果有想要动画,又要解决问题,可以尝试我以下的方法:

创建一个bean类,该bean类用来储存每个Viewholder显示的数据

private class ViewHolderBean{

public String shuju;
public String shuju2;

public int positon;

//constructor

//getter and setter

}

注意到有一个position变量,用来标识数据和选中viewholder的position对应关系

然后通过一个List来管理这些bean

private ArrayList<ViewHolderBean> itemViews = new ArrayList<>();

每次绑定ViewHolder的时候向列表添加新数据

@Override
public void onBindViewHolder(@NonNull @NotNull ViewHolder holder, int position) {

itemViews.add(new ViewHolderBean(你的数据...,position));

}

具体使用就是当要插入数据或者删除数据时找出列表里面bean的position与点击的Viewholder的position的条目再用bean里面的内容进行操作

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (ViewHolderBean bean: itemViews) {
                    if (bean.getPosition() == position) {
                        data.remove(bean.getdata());
                        notifyItemRemoved(holder.getLayoutPosition());
                    }
                }
            }
        });

注意到这行: 

notifyItemRemoved(holder.getLayoutPosition());

虽然viewholder的position不会刷新,但是recyclerview的item数量还是减少了的,所以我们移除的应该是viewholder在列表中的位置

???

等等,holder.getLayoutPosition()不是能获得准确的position吗

所以以上都是废话,真正解决办法是使用holder.getLayoutPosition()代替position

同时,因为holder.getLayoutPosition()会变化,所以不要设置为局部变量使用:

val layoutPosition = holder.getLayoutPosition()

可能有点问题,如果条目特别多效果不是很好

如果有什么更好的办法可以分享一下

RecyclerView图片错乱问题通常出现在滑动过程中,这是由于RecyclerView的回收复用机制导致的。 RecyclerView的回收复用机制可以提高列表的滑动效率,但在复用过程中有可能出现图片错乱问题。这是因为复用的View可能会带有之前加载的图片或者其他数据,而在新的位置显示时,没有及时更新内容。 解决RecyclerView图片错乱问题的方法有以下几种: 1. 使用ViewHolder设计模式:在ViewHolder中,通过getItemViewType()方法判断当前Item所属类型,然后根据不同的类型进行相应的数据加载和图片显示操作。这样可以确保复用的View正确显示对应位置的内容,避免图片错乱问题的发生。 2. 使用图片加载框架:如Glide或Picasso等,这些图片加载框架可以自动处理图片加载、缓存和显示等问题,避免出现图片错乱的情况。可以使用框架提供的方法,在加载图片前对ImageView进行重置,确保显示正确的图片。 3. 设置数据标记:在数据源中为每个Item设置唯一标识,可以使用position作为标识。在加载图片时,将标识与ImageView绑定,只有当标识匹配时才进行图片加载和显示操作。这样可以确保每个ImageView只显示对应标识的图片,避免图片错乱。 4. 及时取消加载:在RecyclerView滑动过程中,可以对滑动过程中无需显示的Item进行图片加载的取消操作,避免加载到错误的图片。可以通过监听滑动事件,在滑动停止时再进行图片加载。 通过以上方法可以有效地解决RecyclerView图片错乱问题,保证列表的显示正确性。在实际开发中,根据具体的情况选择合适的解决方案,并进行适当的优化,保证App的性能和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值