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

如何实现RecyclerView Item点击传递UID到BottomSheetDialogFragment

解决RecyclerView Item点击传递UID到BottomSheetDialogFragment的问题

核心思路:避免在Holder中直接操作FragmentManager

Holder的职责仅为绑定数据与UI,不应持有FragmentManager这类组件引用。正确做法是将点击事件回调至Activity/Fragment,再由它们负责创建并显示BottomSheetDialogFragment。

步骤1:完善ItemClickListener接口

确保接口能传递点击项的UID:

interface ItemClickListener {
    fun onItemClicked(uid: String)
}

步骤2:在Adapter中持有接口实例并传递给Holder

修改TovarsAdapter,添加接口成员变量,在创建Holder时传入:

class TovarsAdapter(private val itemClickListener: ItemClickListener) : RecyclerView.Adapter<ClientTivarHolder>() {
    private val tovarList = mutableListOf<Tovar>()

    // ... 实现submitList、getItemCount等基础方法

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ClientTivarHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_tovar, parent, false)
        return ClientTivarHolder(view, itemClickListener)
    }

    override fun onBindViewHolder(holder: ClientTivarHolder, position: Int) {
        val tovar = tovarList[position]
        holder.bind(tovar)
    }
}

步骤3:在Holder中绑定点击事件并触发回调

给Item根布局设置点击监听,通过接口把UID传递出去:

class ClientTivarHolder(itemView: View, private val itemClickListener: ItemClickListener) : RecyclerView.ViewHolder(itemView) {
    fun bind(tovar: Tovar) {
        // ... 绑定商品名称、图片等UI数据
        
        // 给Item整项设置点击事件
        itemView.setOnClickListener {
            itemClickListener.onItemClicked(tovar.uid)
        }
    }
}

步骤4:在TovarActivity中实现接口并显示BottomSheet

在Activity中实现ItemClickListener,拿到UID后创建并展示BottomSheet:

class TovarActivity : AppCompatActivity(), ItemClickListener {
    private lateinit var recyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tovar)
        
        recyclerView = findViewById(R.id.recycler_view)
        recyclerView.adapter = TovarsAdapter(this)
        // ... 配置LayoutManager等RecyclerView基础参数
    }

    override fun onItemClicked(uid: String) {
        // 实例化BottomSheet并传递UID参数
        val bottomSheet = TovarDetailBottomSheetFragment.newInstance(uid)
        bottomSheet.show(supportFragmentManager, bottomSheet.tag)
    }
}

步骤5:在BottomSheetDialogFragment中接收并使用UID

通过静态方法newInstance传递参数,在Fragment内部获取UID并加载对应信息:

class TovarDetailBottomSheetFragment : BottomSheetDialogFragment() {
    companion object {
        private const val ARG_UID = "arg_uid"

        fun newInstance(uid: String): TovarDetailBottomSheetFragment {
            val fragment = TovarDetailBottomSheetFragment()
            val args = Bundle()
            args.putString(ARG_UID, uid)
            fragment.arguments = args
            return fragment
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val uid = arguments?.getString(ARG_UID)
        // 使用UID请求对应商品信息并更新BottomSheet UI
        return inflater.inflate(R.layout.bottom_sheet_tovar_detail, container, false)
    }
}

为何之前在Holder中使用FragmentManager失败?

  • Holder的生命周期与Activity/Fragment不同步,若持有FragmentManager引用,可能在Activity已销毁时触发操作,导致空指针或状态异常。
  • 违背单一职责原则,Holder仅应负责UI数据绑定,不应处理Dialog显示这类业务逻辑。

内容的提问来源于stack exchange,提问作者Иван Петров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:55:14