RecyclerView的局部更新

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("");
        }
    }
}
RecyclerView局部闪烁是指在使用RecyclerView进行局部时,界面出现明显的闪烁现象。这种现象通常是由于RecyclerViewItem过程中引起的,下面是一些可能导致RecyclerView局部闪烁的原因和解决方法。 1. 数据源变化频繁:当RecyclerView的数据源频繁发生变化时,局部可能会导致闪烁。解决办法可以是尽量减少数据源的变化,例如使用DiffUtil工具类来优化数据比较,只更新真正变化的Item。 2. ViewHolder的重用问题:如果RecyclerViewItem中使用了动画效果,而在进行局部时未正确处理ViewHolder的重用问题,可能会导致动画重复播放,从而产生闪烁。解决办法是在局部的时候,清除或暂停动画效果,并正确处理ViewHolder的重用逻辑。 3. 刷时的绘制问题:默认情况下,RecyclerView进行Item局部时,会重绘制整个Item View,这可能会导致闪烁。解决办法是通过重写Item View的onDraw()方法,在局部时只绘制变化的部分,而不是整个Item View。 4. 使用过多的动画效果:如果RecyclerView中的Item View使用了过多的动画效果,例如淡入淡出、旋转等,这些动画效果在局部时会导致闪烁。解决办法是优化动画效果的使用,尽量减少动画效果的数量和复杂度。 总之,解决RecyclerView局部闪烁问题的方法包括优化数据源的变化、正确处理ViewHolder的重用逻辑、优化绘制和动画效果的使用等。通过这些措施,可以有效减少RecyclerView局部闪烁的现象,提升用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值