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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
android 中win10 使用uwp控件实现进度条Marquez效果
这篇文章主要介绍了android 中win10 使用uwp控件实现进度条Marquez效果,需要的朋友可以参考下2017-06-06Android程序开发中单选按钮(RadioGroup)的使用详解
在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧2016-03-03Flutter 中的PageStorage小部件使用及最佳实践
在Flutter中,PageStorage小部件提供了一种方法来保存和恢复页面间的信息,这对于具有多个页面且需要在这些页面之间共享状态的应用程序非常有用,本文将详细介绍PageStorage的用途、如何使用它以及一些最佳实践,感兴趣的朋友跟随小编一起看看吧2024-05-05
最新评论