RecyclerView的局部更新

本文深入探讨了RecyclerView的刷新机制,包括列表重新加载、item刷新和局部刷新,强调局部刷新能减少UI绘制。讲解了各种notify方法的使用,如notifyDataSetChanged()、notifyItemChanged()等,以及如何利用payload实现局部更新,减少闪烁,提高用户体验。在onBindViewHolder中通过payload判断并更新特定View,实现高效的数据刷新策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RecyclerView的刷新可以分为列表重新加载刷新、item刷新、item中局部刷新。对于前两种的刷新,都会是的列表刷新的时候闪烁一下,而后者则看不出列表有任何闪烁,并且,局部刷新能在一定程度上减少不必要的UI绘制渲染

RecyclerView 数据刷新的几种方式,RecyclerView 真正的布局刷新的正确方式

notifyDataSetChanged() 刷新全部可见的item

notifyItemChanged(int position) 更新列表position位置上的数据可以调用

notifyItemInserted(int position) 列表position位置添加一条数据时可以调用,伴有动画效果

notifyItemRemoved(int position) 列表position位置移除一条数据时调用,伴有动画效果

notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的数据移到toPosition位置时调用,伴有动画效果

notifyItemRangeChanged(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项进行数据刷新

notifyItemRangeInserted(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量添加数据时调用,伴有动画效果

notifyItemRangeRemoved(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量删除数据时调用,伴有动画效果

关于view的局部刷新就是notifyItemChanged(int, Object)方法,下面具体说说:

notifyItemChange有两个构造方法:

  • notifyItemChanged(int position, @Nullable Object payload)

  • notifyItemChanged(int position)

其中payload参数可以认为是你要刷新的一个标示,比如我有时候只想刷新itemView中的textview,有时候只想刷新imageview?又或者我只想某一个view的文字颜色进行高亮设置?那么我就可以通过payload参数来标示这个特殊的需求了。

具体怎么做呢?比如我调用了notifyItemChanged(14,"changeColor"),那么在onBindViewHolder回调方法中做下判断即可:

@Override
public void onBindViewHolder(ViewHolderholder, int position, List<Object> payloads) {
    if (payloads.isEmpty()) {
        // payloads为空,说明是更新整个ViewHolder
        onBindViewHolder(holder, position);
    } else {
        // payloads不为空,这只更新需要更新的View即可。
        String payload = payloads.get(0).toString();
        if ("changeColor".equals(payload)) {
            holder.textView.setTextColor("");
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值