1. 前言
最近我在项目中,发现一个同事写 RecyclerView.Adapter 的时候都习惯定义一个全局的私有 mContext,然后在 onCreateViewHolder(parent: ViewGroup, viewType: Int) 方法中进行赋值操作 mContext = parent.context。
如下:
class MyAdapter(private val dataList: List<MyData>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
private lateinit var mContext: Context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
//在这里进行context的赋值
mContext = parent.context
val view = LayoutInflater.from(parent.context).inflate(R.layout.rcy_item_view, parent, false)
return MyViewHolder(view)
}
override fun getItemCount(): Int {}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {}
}
WT,还可以这么操作!!第一次见到这样的写法,有点意思,由此有了这一篇文章。
2. 获取到 Context 的四种方式
很多时候我们需要在 RecyclerView.Adapter 中使用到 context,比如:利用 Glide 来加载网络图片的时候。
这时,我们该如何拿到 context 给 Glide 呢?
2.1 通过 Adapter 构造函数传入 Context
这是我之前最常用的一种方式,通过 Adapter 构造函数将当前Activity Context传进来,如下:
class MyAdapter(
private val context: Context,
private val dataList: List<MyData>
) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(val binding: RcyItemViewBinding) :
RecyclerView.ViewHolder(binding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val binding = RcyItemViewBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return MyViewHolder(binding)
}
override fun getItemCount(): Int = dataList.size
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val data = dataList[position]
holder.binding.apply {
Glide.with(context).load(data.imageUrl).into(holder.binding.imageIv)
holder.binding.contentTv.text = data.content
}
}
}