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

如何在RecyclerView Adapter中初始化Context以使用自定义Dialog?

在RecyclerView Adapter中获取Context用于自定义Dialog的几种方案
  • 方案一:构造函数传入Context
    直接在Adapter初始化时传入Context,可全局调用:
class MainAdapter(private val cityList: List<City>, private val context: Context) : RecyclerView.Adapter<MainAdapter.ViewHolder>(){

    // ... 原有代码不变

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val city = cityList[position]
        holder.cityBinding.cityCard = city

        holder.cityBinding.cardCity.setOnClickListener {
            // 直接用传入的Context创建Dialog
            val dialog = CustomDialog(context)
            dialog.show()
        }
    }
}

初始化Adapter时(Activity/Fragment中):

// Activity中用this,Fragment中用requireContext()
val adapter = MainAdapter(cityList, this)
  • 方案二:从ViewHolder的itemView获取Context
    无需额外存储Context,点击事件里直接从View取,安全又省事:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val city = cityList[position]
    holder.cityBinding.cityCard = city

    holder.cityBinding.cardCity.setOnClickListener {
        val dialogContext = holder.itemView.context
        val dialog = CustomDialog(dialogContext)
        dialog.show()
    }
}
  • 方案三:在onCreateViewHolder中初始化Context
    利用onCreateViewHolder的parent参数获取Context并保存:
class MainAdapter(private val cityList: List<City>) : RecyclerView.Adapter<MainAdapter.ViewHolder>(){
    private lateinit var context: Context

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        context = parent.context // 在这里完成Context初始化
        val binding = CityCardBinding.inflate(LayoutInflater.from(context), parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val city = cityList[position]
        holder.cityBinding.cityCard = city

        holder.cityBinding.cardCity.setOnClickListener {
            val dialog = CustomDialog(context)
            dialog.show()
        }
    }
}

注意:优先选方案一或方案二,方案三的Context若持有Activity引用,在Adapter生命周期长于Activity时可能引发内存泄漏;方案二中的Context与View生命周期绑定,风险更低。

内容的提问来源于stack exchange,提问作者Mert Ozan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:50:36