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
相关产品推荐
相关产品推荐

