RecyclerView使用payload實現(xiàn)局部刷新
本文實例為大家分享了RecyclerView使用payload實現(xiàn)局部刷新的具體代碼,供大家參考,具體內(nèi)容如下
列表局部刷新:
01.notifyDataSetChanged() 刷新全部可見的item
02.notifyItemChanged(int position) 更新列表position位置上的數(shù)據(jù)可以調(diào)用
03.notifyItemInserted(int position) 列表position位置添加一條數(shù)據(jù)時可以調(diào)用,伴有動畫效果
04.notifyItemRemoved(int position) 列表position位置移除一條數(shù)據(jù)時調(diào)用,伴有動畫效果
05.notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的數(shù)據(jù)移到toPosition位置時調(diào)用,伴有動畫效果
06.notifyItemRangeChanged(int positionStart, int itemCount) 列表從positionStart位置到itemCount數(shù)量的列表項進行數(shù)據(jù)刷新
07.notifyItemRangeInserted(int positionStart, int itemCount) 列表從positionStart位置到itemCount數(shù)量的列表項批量添加數(shù)據(jù)時調(diào)用,伴有動畫效果
08.notifyItemRangeRemoved(int positionStart, int itemCount) 列表從positionStart位置到itemCount數(shù)量的列表項批量刪除數(shù)據(jù)時調(diào)用,伴有動畫效果
一、payload、notifyItemChanged()實現(xiàn)局部刷新:
1.在適配器中定義onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList)方法:
class NewsAdapter : ListAdapter<Data, NewsAdapter.ViewHolder>(Diff()) { //構建ListView的數(shù)據(jù)比較結果 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>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
android 中win10 使用uwp控件實現(xiàn)進度條Marquez效果
這篇文章主要介紹了android 中win10 使用uwp控件實現(xiàn)進度條Marquez效果,需要的朋友可以參考下2017-06-06Android自定義ViewFlipper實現(xiàn)滾動效果
這篇文章主要為大家詳細介紹了Android自定義ViewFlipper實現(xiàn)滾動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08Android程序開發(fā)中單選按鈕(RadioGroup)的使用詳解
在android程序開發(fā)中,無論是單選按鈕還是多選按鈕都非常的常見,接下來通過本文給大家介紹Android程序開發(fā)中單選按鈕(RadioGroup)的使用,需要的朋友參考下吧2016-03-03Flutter 中的PageStorage小部件使用及最佳實踐
在Flutter中,PageStorage小部件提供了一種方法來保存和恢復頁面間的信息,這對于具有多個頁面且需要在這些頁面之間共享狀態(tài)的應用程序非常有用,本文將詳細介紹PageStorage的用途、如何使用它以及一些最佳實踐,感興趣的朋友跟隨小編一起看看吧2024-05-05Android自定義ViewGroup的實現(xiàn)方法
這篇文章主要為大家詳細介紹了Android自定義ViewGroup的實現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-05-05