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

RecyclerView Adapter点击事件向Fragment传递多参数实现方案

解决方案

核心思路是扩展Adapter点击监听器的参数列表,把需要传递的View、数据模型甚至其他额外参数一起通过lambda传递给Fragment,具体实现如下:

1. 修改Adapter中的点击监听器定义

把原来仅接收TransitionModel的lambda,改成同时接收目标View(比如item内的共享元素)和数据模型的形式,若需要更多参数直接在lambda中添加即可:

// 更新监听器类型,支持同时接收View和TransitionModel
private var onItemClickListener: ((View, TransitionModel) -> Unit)? = null

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val article = differ.currentList[position]
    holder.itemView.apply {
        // 获取item里需要传递的View(比如你的共享元素ImageView)
        val sharedElementView = findViewById<ImageView>(R.id.imgsd)
        setOnClickListener {
            onItemClickListener?.invoke(sharedElementView, article)
        }
    }
}

// 更新监听器设置方法的参数类型
fun setOnItemClickListener(listener: (View, TransitionModel) -> Unit) {
    onItemClickListener = listener
}

2. 在Fragment中接收并使用参数

Fragment侧直接接收Adapter传递过来的View和数据,用这些参数完成跳转逻辑:

financeTransitionAdapter.setOnItemClickListener { sharedView, article ->
    // 用Adapter传过来的View创建共享元素过渡配置
    val extras = FragmentNavigator.Extras.Builder()
        .addSharedElement(sharedView, "trans")
        .build()

    // 若需要传递article中的数据,打包成Bundle
    val jumpBundle = Bundle().apply {
        putParcelable("transition_data", article) // 前提是TransitionModel实现Parcelable接口
        // 可添加其他参数,比如putString("extra_key", "extra_value")
    }

    findNavController(requireView())
        .navigate(
            R.id.action_FirstFragment_to_showTransitionFragment,
            jumpBundle,
            null,
            extras
        )
}

3. 可选:用数据类封装多参数(参数较多时)

如果需要传递的参数超过2-3个,建议用数据类封装,避免lambda参数列表过长:

首先定义封装参数的数据类:

data class ItemClickInfo(
    val sharedView: View,
    val model: TransitionModel,
    val extraText: String,
    val extraNum: Int
)

然后修改Adapter的监听器:

private var onItemClickListener: ((ItemClickInfo) -> Unit)? = null

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val article = differ.currentList[position]
    holder.itemView.apply {
        val sharedView = findViewById<ImageView>(R.id.imgsd)
        val extraText = "自定义额外文本"
        val extraNum = 100
        setOnClickListener {
            onItemClickListener?.invoke(ItemClickInfo(sharedView, article, extraText, extraNum))
        }
    }
}

fun setOnItemClickListener(listener: (ItemClickInfo) -> Unit) {
    onItemClickListener = listener
}

Fragment中接收使用:

financeTransitionAdapter.setOnItemClickListener { clickInfo ->
    val extras = FragmentNavigator.Extras.Builder()
        .addSharedElement(clickInfo.sharedView, "trans")
        .build()

    val jumpBundle = Bundle().apply {
        putParcelable("transition_data", clickInfo.model)
        putString("extra_text", clickInfo.extraText)
        putInt("extra_num", clickInfo.extraNum)
    }

    findNavController(requireView())
        .navigate(
            R.id.action_FirstFragment_to_showTransitionFragment,
            jumpBundle,
            null,
            extras
        )
}

内容的提问来源于stack exchange,提问作者mobin jafari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:09:26