You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 12:45:03