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

