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 Studio gradle配置packagingOptions打包so库重复
这篇文章主要为大家介绍了Android Studio gradle配置packagingOptions打包so库重复问题的解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
Android handle-message的发送与处理案例详解
这篇文章主要介绍了Android handle-message的发送与处理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-08-08
Mac 下 Android Studio 不打印日志的解决办法
这篇文章主要介绍了Mac 下 Android Studio 不打印日志的解决办法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下2017-10-10
Flutter 自定义Drawer 滑出位置的大小实例代码详解
这篇文章主要介绍了Flutter 自定义Drawer 滑出位置的大小,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04
Android App开发中自定义View和ViewGroup的实例教程
这篇文章主要介绍了Android App开发中自定义View和ViewGroup的实例教程,分别介绍了进度条和图片上传并排列的例子,效果很好很强大,需要的朋友可以参考下2016-05-05


最新评论