Google的MergeAdapter的使用

1. 簡介

此次想要介紹的是由谷歌推出的MergeAdapter。聽名字就應該知道它是和RecyclerView相關的組件。android

該組件是在androidx.recyclerview:recyclerview:1.2.0-alpha02中推出,它的主要中做用是把多個Adapter集中在一個Adapter中,而後在RecyclerView中顯示。git

正常的Adapter是隻能存在一種ViewType,因此若是想實現RecyclerView中顯示不一樣的ViewType則須要本身額外進行擴展,或者使用相似於Groupie(關於Groupie的教程)的外部庫。github

可是有了MergeAdapter, 咱們能夠直接使用它就能夠實現上述的需求,很是的方便。數組

廢話很少說,先介紹用法,而後再討論它的好與不足。app

2. 使用方法

2.1 引入庫

build.gradle中加入RecyclerView的庫。ide

androidx.recyclerview:recyclerview:1.2.0-alpha02
複製代碼

2.2 建立Adapter的Layout

這裏根據本身的需求建立layout,須要多少ViewType就建立相應的layout就能夠了。post

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <androidx.constraintlayout.widget.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:textSize="20sp"
            android:layout_marginStart="20dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            tools:text="hello" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
複製代碼

2.3 建立Adapter

這裏也是根據本身的需求建立Adapter就能夠了。和正常的用法同樣。gradle

class FirstAdapter(private val data: List<String>) :
    ListAdapter<String, FirstAdapter.ViewHolder>(DiffCallback()) {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from((parent.context))
        val binding: ItemFirstBinding =
            DataBindingUtil.inflate(inflater, R.layout.item_first, parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.binding.textView1.text = data[position]
    }

    override fun getItemCount(): Int {
        return data.size
    }

   class DiffCallback : DiffUtil.ItemCallback<String>() {
        override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
            return oldItem == newItem
        }
        override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
            return oldItem === newItem
        }
    }

    class ViewHolder(var binding: ItemFirstBinding) : RecyclerView.ViewHolder(binding.root)
複製代碼

2.4 建立MergeAdapter

咱們在MainActivity中建立MergeAdapter而後傳RecyclerViewui

val firstAdapter = FirstAdapter(data)
val secondAdapter = SecondAdapter(data)
val thirdAdapter = ThirdAdapter(data)

// 建立MergeAdapter
// 須要經過listOf把多個adapter傳給MergeAdapter
mergeAdapter = MergeAdapter(listOf(firstAdapter,secondAdapter,thirdAdapter))

binding.recyclerView.adapter = mergeAdapter
複製代碼

3. 關於MergeAdapter

3.1 移除adapter

能夠對已經存在的adapter進行移除。spa

mergeAdapter.removeAdapter(firstAdapter)
複製代碼

3.2 添加adapter

能夠在MergeAdapter傳給RecyclerView之後,還以能夠添加adapter。

mergeAdapter.addAdapter(firstAdapter)
複製代碼

3.3 獲取當前的adapter數組

能夠獲取當前已經傳給RecyclerView的adapter數組。

val adapters = mergeAdapter.adapters
複製代碼

3.4 adapter的複用

默認的狀況是每一個adapter都會維護本身的ViewHolder pool,且adapter之間不能複用。若是咱們想要複用則須要設置MergeAdapter.Config

val configBuilder = MergeAdapter.Config.Builder()
configBuilder.setIsolateViewTypes(false)
複製代碼

而後在建立MergeAdapter的時候,把Config傳進去。

val mergeAdapter = MergeAdapter(configBuilder.build(),listOf(firstAdapter,secondAdapter,thirdAdapter))
複製代碼

3.5 數據更新的通知

須要有新數據更新時調用相應的adapter, 而後用相應的adapternotifyDatasetChanged。調用adapternotifyDatasetChanged,最後MergeAdapternotifyDatasetChanged也會被調用。

thirdAdapter.submitList(addData())
thirdAdapter.notifyDataSetChanged()
複製代碼

4. 不足之處

有點天然沒必要多說,可是MergeAdapter有一個顯而易見的不足之處就是ViewType不能混合使用,使其應用範圍受到了很大的限制。可是若是沒有這樣的需求則仍是優先使用MergeAdapter吧!

5. GitHub

GitHub: github.com/HyejeanMOON…

關於Jetpack的Paging教程: juejin.im/post/5e75db…

Groupie的教程: juejin.im/post/5e9059…

相關文章
相關標籤/搜索