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…

相关文章
相关标签/搜索