recycleView局部更新item中的 局部控件 高效方法

最近 做项目,设计到一个recycleView里面 更新进度条的需求。在网上搜索了 一下,发现了一个方法。然后,自己又深入研究了一下 。现在写一下见解。
首先,我们来认识一下 RecyclerView.Adapter 里面的两个方法
第一个是: public void onBindViewHolder(@NonNull ViewHolder holder, int position)
第二个是: public void onBindViewHolder(@NonNull VH holder, int position, @NonNull List<Object> payloads) { onBindViewHolder(holder, position); }
第二个方法要和 notifyItemChanged(int position, @Nullable Object payload)这个方法一起用。这个一定要注意 和平常的notifyItemChanged 相比 多个 一个 payload 参数 。这个是我们自己自定义的值 用来标识 你想更新那个控件,对应于第二个里面的List payloads

如果你细心看的话,你会发现 第二个方法会多了一个参数 List< Object> payloads。这个参数是用来干什么用的呢? 看Android源码
在这里插这个入图片描述
这个意思呢 ,就是当payloads 不是空的时候, ViewHolder 只会进行 有效率的,局部的更新绑定。如果payloads为空的时候,那么Adapter 必须进行一个完整的绑定。

这样大家就明白了吧。在ViewHolder 调用周期里面,总是会先调用 带payloads参数的这个方法,再决定是否调用 不带payloads参数的方法。 在recycleView的绘制视图中,系统会默认的将payloads这个参数设置为空,所以我们如果不做设定的话,每次都是更新整个item
如果 要是你的item中含有 加载图片的话,你就会发现 每次刷新视图都会重新加载图片,浪费流量不说,也耗费性能。

接下来 我就写了一个小demo 用来验证一下
首先当然是我们的 item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

   <Button
       android:id="@+id/one"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="one"
       />

    <Button
        android:id="@+id/two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="two"
        />
    <Button
        android:id="@+id/three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="three"
        />
</LinearLayout>

在这里插入图片描述

页面布局就是一个recycleView 这个就不贴代码了

为了贴近 真实项目 我还定义了bean 用于承载数据

package com.admin.plani.item;

/**
 * 创建时间 2018/9/26
 *
 * @author plani
 */
public class TestBean {
   
    private String image;
    private String size;
    private int age;

    public TestBean(String image, String size, int age) {
   
        this.
  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现两个RecyclerView item之间的拖拽动画,可以使用ItemTouchHelper类。以下是基本步骤: 1. 创建一个实现ItemTouchHelper.Callback的类,重写以下方法: - onMove():当用户拖动item时,返回true,同时交换item的位置。 - onSwiped():当用户滑动item时,执行删除或其他操作。 - getMovementFlags():设置拖拽和滑动的方向。 2. 在RecyclerView的Adapter实现ItemTouchHelperAdapter接口,重写以下方法: - onItemMove():当item被移动时,将item的位置交换。 - onItemDismiss():当item被删除时,执行删除操作。 3. 在Activity或Fragment创建ItemTouchHelper实例,并将其附加到RecyclerView上。 4. 在Adapter实现动画效果,可以使用ItemAnimator类。例如,使用DefaultItemAnimator类实现默认的动画效果。 以下是示例代码: ```kotlin class MyItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() { override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END return makeMovementFlags(dragFlags, swipeFlags) } override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { adapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition) return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { adapter.onItemDismiss(viewHolder.adapterPosition) } } interface ItemTouchHelperAdapter { fun onItemMove(fromPosition: Int, toPosition: Int) fun onItemDismiss(position: Int) } class MyAdapter(private val data: MutableList<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>(), ItemTouchHelperAdapter { // ... override fun onItemMove(fromPosition: Int, toPosition: Int) { // 交换item Collections.swap(data, fromPosition, toPosition) notifyItemMoved(fromPosition, toPosition) } override fun onItemDismiss(position: Int) { // 删除item data.removeAt(position) notifyItemRemoved(position) } // ... } // 在Activity或Fragment val callback = MyItemTouchHelperCallback(adapter) val touchHelper = ItemTouchHelper(callback) touchHelper.attachToRecyclerView(recyclerView) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值