您好,登錄后才能下訂單哦!
小編給大家分享一下RecyclerView如何使用payload實現(xiàn)局部刷新,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
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()) { //構(gòu)建ListView的數(shù)據(jù)比較結(jié)果 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>
看完了這篇文章,相信你對“RecyclerView如何使用payload實現(xiàn)局部刷新”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。