RecyclerView使用payload实现局部刷新

 更新时间:2021年10月03日 16:28:19   作者:独沽一味的猪  
这篇文章主要为大家详细介绍了RecyclerView使用payload实现局部刷新,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了RecyclerView使用payload实现局部刷新的具体代码,供大家参考,具体内容如下

列表局部刷新:

01.notifyDataSetChanged() 刷新全部可见的item
02.notifyItemChanged(int position) 更新列表position位置上的数据可以调用
03.notifyItemInserted(int position) 列表position位置添加一条数据时可以调用,伴有动画效果
04.notifyItemRemoved(int position) 列表position位置移除一条数据时调用,伴有动画效果
05.notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的数据移到toPosition位置时调用,伴有动画效果
06.notifyItemRangeChanged(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项进行数据刷新
07.notifyItemRangeInserted(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量添加数据时调用,伴有动画效果
08.notifyItemRangeRemoved(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量删除数据时调用,伴有动画效果

一、payload、notifyItemChanged()实现局部刷新:

1.在适配器中定义onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList)方法:

class NewsAdapter : ListAdapter<Data, NewsAdapter.ViewHolder>(Diff()) {

    //构建ListView的数据比较结果
    class Diff : DiffUtil.ItemCallback<Data>() {
        override fun areItemsTheSame(oldItem: Data, newItem: Data): Boolean {
            return oldItem.hashId == newItem.hashId
        }

        override fun areContentsTheSame(oldItem: Data, newItem: Data): Boolean {
            return oldItem.content == newItem.content
        }
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val tvContent: TextView = view.findViewById(R.id.tvContent)
        var tvPlay: TextView = view.findViewById(R.id.tvPlay)
        var tvPlay1: TextView = view.findViewById(R.id.tvPlay1)
        var tvPlay2: TextView = view.findViewById(R.id.tvPlay2)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.layout_joke_list_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.tvContent.text = getItem(position).content
        holder.tvPlay.text = "播放"
        holder.tvPlay1.text = "播放"
        holder.tvPlay2.text = "播放"
    }

    //局部刷新Item
    override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>) {
        if(payloads.isEmpty()) {
            onBindViewHolder(holder, position)
        } else {
            for (i in 0 until payloads.size) {
                when(payloads[i].toString()) {
                    "aaa" -> {
                        holder.tvContent.text = "000"
                    }
                    "bbb" -> {
                        holder.tvPlay.text = "222"
                    }
                }
            }
        }
    }
}

2.使用notifyItemChanged()进行局部刷新:

class MainActivity : AppCompatActivity() {

    private lateinit var recycler: RecyclerView
    private lateinit var mAdapter: NewsAdapter

    val data = listOf(
        Data("123", "123", 1, "123"),
        Data("456", "456", 1, "456"),
        Data("789", "789", 1, "789")
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recycler = findViewById(R.id.recycler)
        mAdapter = NewsAdapter()
        val layoutManager = LinearLayoutManager(this)
        recycler.layoutManager = layoutManager
        recycler.adapter = mAdapter
        mAdapter.submitList(data)
        //点击局部刷新
        findViewById<Button>(R.id.btn).setOnClickListener {
            mAdapter.notifyItemChanged(2, "aaa")
            mAdapter.notifyItemChanged(0, "aaa")
            mAdapter.notifyItemChanged(1, "aaa")
            mAdapter.notifyItemChanged(2, "bbb")
            mAdapter.notifyItemChanged(0, "bbb")
            mAdapter.notifyItemChanged(1, "bbb")
        }

    }
}

3.MainActivity布局文件:

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

    <Button
        android:id="@+id/btn"
        android:text="局部刷新"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

4.列表Item布局文件:

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

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@android:color/white">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="8dp">

            <TextView
                android:id="@+id/tvContent"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@android:color/black"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/tvPlay"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="end"
                android:text="哈哈" />

            <TextView
                android:id="@+id/tvPlay1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="end"
                android:text="哈哈" />

            <TextView
                android:id="@+id/tvPlay2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="end"
                android:text="哈哈" />

        </LinearLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Retrofit网络请求和响应处理重点分析讲解

    Retrofit网络请求和响应处理重点分析讲解

    这篇文章主要介绍了Retrofit网络请求和响应处理重点分析,在使用 Retrofit发起网络请求时,我们可以通过定义一个接口并使用Retrofit的注解来描述这个接口中的请求,Retrofit会自动生成一个实现该接口的代理对象
    2023-03-03
  • Android Studio gradle配置packagingOptions打包so库重复

    Android Studio gradle配置packagingOptions打包so库重复

    这篇文章主要为大家介绍了Android Studio gradle配置packagingOptions打包so库重复问题的解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android handle-message的发送与处理案例详解

    Android handle-message的发送与处理案例详解

    这篇文章主要介绍了Android handle-message的发送与处理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Mac 下 Android Studio 不打印日志的解决办法

    Mac 下 Android Studio 不打印日志的解决办法

    这篇文章主要介绍了Mac 下 Android Studio 不打印日志的解决办法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Flutter 自定义Drawer 滑出位置的大小实例代码详解

    Flutter 自定义Drawer 滑出位置的大小实例代码详解

    这篇文章主要介绍了Flutter 自定义Drawer 滑出位置的大小,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Android 8.0实现发送通知

    Android 8.0实现发送通知

    这篇文章主要为大家详细介绍了Android 8.0实现发送通知,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android:下拉刷新+加载更多+滑动删除实例讲解

    Android:下拉刷新+加载更多+滑动删除实例讲解

    本文主要讲解 Android下拉刷新+加载更多+滑动删除的示例,这里整理了相关资料并附示例代码供大家学习参考,有需要的小伙伴可以参考下
    2016-08-08
  • Android系统服务是如何获取的

    Android系统服务是如何获取的

    这篇文章主要介绍了Android系统服务是如何获取的,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • Android App开发中自定义View和ViewGroup的实例教程

    Android App开发中自定义View和ViewGroup的实例教程

    这篇文章主要介绍了Android App开发中自定义View和ViewGroup的实例教程,分别介绍了进度条和图片上传并排列的例子,效果很好很强大,需要的朋友可以参考下
    2016-05-05
  • Flutter数据库的使用方法

    Flutter数据库的使用方法

    这篇文章主要介绍了Flutter数据库的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论