如何设置适配器以获取不同的对象数组?

How to set adapter to get different object array?

我有一个 recyclerview 的布局,但我想尝试一下适配器可以接收多个数组对象。

例子

var array1 : Arraylist<ObjectA>
var array2 : Arraylist<ObjectB>

fun foo1(){
   recyclerview.setAdapter(MainAdapter(array1))
}

fun foo2(){
   recyclerview.setAdapter(MainAdapter(array2))
}

如何设置 Main Adapter 来接收不同的数组?因为 recyclerview 使用相同的布局,相同的列表项但不同的数据。或者我应该继续使用 2 个不同的适配器? 我使用的是通用 class 适配器,但我不知道如何正确创建通用 class?

一个适配器就够了。

class MainAdapter : BaseAdapter() {
    private var dataSourceA: Arraylist<ObjectA> = ArrayList()
    private var dataSourceB: Arraylist<ObjectB> = ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder {
        return if (viewType == ITEM_A) {
            generateBindingHolder(R.layout.list_item_a, parent)
        } else {
            generateBindingHolder(R.layout.list_item_b, parent)
        }  
    }

    override fun getItemCount() = dataSourceA.size + dataSourceB.size

    override fun getItemViewType(position: Int): Int {
        return if (position < dataSourceA.size) ITEM_A else ITEM_B
    }

    override fun onBindViewHolder(holder: BindingHolder, position: Int) {
        // check holder' s type
        when (holder.binding) {
            is ListItemABinding -> {
                holder.myBind(holder.binding) {
                    // add a' s listener
                }
            }
            else -> {
                holder.myBind(holder.binding) {
                    // add b' s listener
                }
            }
        }
    }


    fun setDataSourceA(data: Arraylist<ObjectA>) {
        dataSourceA = data
    }

    fun setDataSourceB(data: Arraylist<ObjectB>) {
        dataSourceB = data
    }

    ...

}
val adapter = MainAdapter()
recyclerview.setAdapter(adapter)
adapter.setDataSourceA(array1)
adapter.setDataSourceB(array2)
adapter.notifyDataSetChanged()
abstract class BaseAdapter : RecyclerView.Adapter<BaseAdapter.BindingHolder>() {

    class BindingHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
        fun <T : ViewDataBinding> myBind(receiver: T, block: T.() -> Unit) {
            receiver.block()
            receiver.executePendingBindings()
        }
    }

    companion object {
        fun generateBindingHolder(@LayoutRes layoutRes: Int, parent: ViewGroup): BindingHolder {
            return BindingHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), layoutRes, parent, false))
        }
    }
}