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>
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- RecyclerView實現橫向滾動效果
- Android ListView仿微信聊天界面
- Android studio實現簡易的計算器功能
- Android使用setContentView實現頁面的轉換效果
- Android用viewPager2實現UI界面翻頁滾動的效果