如何在嵌套的Recyler视图中使用Kotlin高阶函数



我有一个回收器视图(Parent(,在它里面,我有另一个回收者视图(Child。

childrecyclerView中有两个操作,我想在Fragment Class上进行这些操作,并动态地做一些事情。

架构:MVVM

,您可以通过以下步骤实现您想要的行为:

我将使用Lambda来参考Higher Order Function

  1. Activity/Fragment -> Parent Adapter传递Lambda函数
  2. Parent Adapter -> Child Adapter传递Lambda函数

例如,当用户从子Recyclerview单击Error Item时,此代码显示如何从嵌套的Recyclerview获取回调。

//In Activity/Fragment
private var errorClick: () -> Unit 
parentAdapter.setErrorClick(errorClick)
//In Parent Adapter
private var errorClick: () -> Unit 
childAdapter.setErrorClick(errorClick)

//In Child Adapter - Now use errorClick to callback methods to Activity/Fragment
private var errorClick: () -> Unit // Use IT!

如果你有任何问题,请告诉我。谢谢

这里是一个高阶函数的例子。

TextAdapter.kt类

class TextAdapter(
val onClick: (String) -> Unit
): RecyclerView.Adapter<TextAdapter.ViewHolder>() {
inner class ViewHolder(val binding: ItemTextBinding) : 
RecyclerView.ViewHolder(binding.root)
private val list: ArrayList<String> = arrayListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
ViewHolder =
ViewHolder(
ItemTextBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

val adapter = InnerAdapter {
onClick.invoke(it)
}
binding.recyclerViewList.adapter = adapter
binding.recyclerViewList.setData(list)
}
override fun getItemCount(): Int = list.size
fun setData(newList: ArrayList<String>) {
list.clear()
list.addAll(newList)
}
}

内部适配器

class InnerAdapter(
val onClick: (String) -> Unit
): RecyclerView.Adapter<InnerAdapter.ViewHolder>() {
inner class ViewHolder(val binding: ItemText1Binding) : 
RecyclerView.ViewHolder(binding.root)
private val list: ArrayList<String> = arrayListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
ViewHolder =
ViewHolder(
ItemText1Binding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

binding.tvTxt.text = list[position]
holder.itemView.setOnClickListener {
//change background color
onClick.invoke(list[position])
}
}
override fun getItemCount(): Int = list.size
fun setData(newList: ArrayList<String>) {
list.clear()
list.addAll(newList)
}
}

现在,您可以点击setAdapter获得项目的值让我们看看

以下函数是从设置适配器的片段类调用的

val adapter = TextAdapter {
showToast(it)
}

最新更新