如何在嵌套RecyclerView场景中使用Kotlin高阶函数
实现方案
核心思路为通过层层透传Kotlin高阶函数回调完成事件传递:子RecyclerView Adapter → 父RecyclerView Adapter → Fragment,整个过程不破坏MVVM分层职责,事件仅在视图层流转,业务逻辑可统一交给ViewModel处理。
步骤1:子RecyclerView Adapter定义高阶函数回调
在子Adapter中声明对应两个操作事件的高阶函数,参数可根据实际需要传递的内容自定义:
class ChildRvAdapter : RecyclerView.Adapter<ChildRvAdapter.ChildViewHolder>() { // 第一个操作事件回调,示例参数为子项数据、子项位置 var onFirstAction: ((childData: ChildItemBean, position: Int) -> Unit)? = null // 第二个操作事件回调,示例参数为子项数据 var onSecondAction: ((childData: ChildItemBean) -> Unit)? = null inner class ChildViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: ChildItemBean) { // 绑定第一个操作,例如点击整个子项 itemView.setOnClickListener { onFirstAction?.invoke(item, adapterPosition) } // 绑定第二个操作,例如点击子项内的删除按钮 itemView.btnDelete.setOnClickListener { onSecondAction?.invoke(item) } } } // Adapter常规实现逻辑省略 }
步骤2:父RecyclerView Adapter透传回调
父Adapter声明相同结构的高阶函数,在绑定子Adapter时完成回调透传,将子层事件向上传递:
class ParentRvAdapter : RecyclerView.Adapter<ParentRvAdapter.ParentViewHolder>() { // 和子Adapter对应的两个高阶函数,用于向上透传事件 var onChildFirstAction: ((childData: ChildItemBean, position: Int) -> Unit)? = null var onChildSecondAction: ((childData: ChildItemBean) -> Unit)? = null inner class ParentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val childRv: RecyclerView = itemView.findViewById(R.id.child_rv) private val childAdapter = ChildRvAdapter() init { // 子Adapter回调直接透传给父Adapter的高阶函数 childAdapter.onFirstAction = { data, pos -> onChildFirstAction?.invoke(data, pos) } childAdapter.onSecondAction = { data -> onChildSecondAction?.invoke(data) } childRv.adapter = childAdapter } fun bind(item: ParentItemBean) { childAdapter.submitList(item.childList) // 其余父项绑定逻辑省略 } } // Adapter常规实现逻辑省略 }
步骤3:Fragment中接收回调执行操作
Fragment初始化父Adapter时,实现两个高阶函数的逻辑即可,需要处理业务逻辑直接调用ViewModel对应方法:
class YourFragment : Fragment() { private val viewModel: YourViewModel by viewModels() private lateinit var parentAdapter: ParentRvAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) parentAdapter = ParentRvAdapter() // 接收子RecyclerView第一个操作事件 parentAdapter.onChildFirstAction = { data, position -> // 执行自定义动态操作,例如弹框、跳转、调用ViewModel逻辑 viewModel.handleFirstAction(data, position) Toast.makeText(context, "触发第一个操作,位置:$position", Toast.LENGTH_SHORT).show() } // 接收子RecyclerView第二个操作事件 parentAdapter.onChildSecondAction = { data -> viewModel.deleteChildItem(data) } // 父RecyclerView绑定Adapter view.findViewById<RecyclerView>(R.id.parent_rv).adapter = parentAdapter } // 页面销毁时置空回调避免内存泄漏 override fun onDestroyView() { parentAdapter.onChildFirstAction = null parentAdapter.onChildSecondAction = null super.onDestroyView() } }
注意事项
- 高阶函数调用前需加
?做判空处理,避免空指针异常 - 整个流程事件仅在视图层传递,业务逻辑全部下沉到ViewModel,符合MVVM架构规范
- 相比接口回调方案,高阶函数实现无需定义额外接口,代码更简洁灵活
内容的提问来源于stack exchange,提问作者Vatsal kesarwani
相关产品推荐
相关产品推荐

