Android中如何在RecyclerAdapter的ViewHolder中使用全局数据
解决RecyclerView Adapter中ViewHolder无法访问全局数据的问题
嘿,我来帮你搞定这个问题!你遇到的是Kotlin内部类访问外部成员的典型问题——你的ViewHolder是Adapter的静态内部类(Kotlin里默认不带inner关键字的内部类都是静态的),所以它没法直接访问外部Adapter类里的userData变量。下面给你几个可行的解决方案:
方案1:把ViewHolder改成内部类(inner class)
直接给ViewHolder加上inner关键字,这样它就能持有外部Adapter的引用,直接访问userData了。修改后的代码如下:
class CategoryAdapter(private val catsModel: MutableList<HomeCatsListResponse.Data.Result>) : RecyclerView.Adapter<CategoryAdapter.ViewHolder>() { private var userData = ADDRESS_LOCATION_LAT override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.type_item, parent, false) return ViewHolder(v) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val type = catsModel[position] holder.bindData(type) } override fun getItemCount(): Int { return catsModel.size } fun setData(catsList: MutableList<HomeCatsListResponse.Data.Result>) { catsModel.addAll(catsList) notifyDataSetChanged() } // 加上inner关键字,变成内部类 inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val txtName = itemView.findViewById<TextView>(R.id.tv_item) fun bindData(type: HomeCatsListResponse.Data.Result) { txtName.text = type.name // 现在可以直接访问userData了! val data = userData } } }
方案2:在bindData时传入userData(更推荐)
如果不想让ViewHolder依赖外部Adapter的状态,更符合单一职责原则的做法是,在onBindViewHolder调用bindData时把userData传进去。这样ViewHolder只负责处理传入的数据,耦合性更低:
class CategoryAdapter(private val catsModel: MutableList<HomeCatsListResponse.Data.Result>) : RecyclerView.Adapter<CategoryAdapter.ViewHolder>() { private var userData = ADDRESS_LOCATION_LAT override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.type_item, parent, false) return ViewHolder(v) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val type = catsModel[position] // 把userData传入bindData方法 holder.bindData(type, userData) } // 其他方法不变... class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val txtName = itemView.findViewById<TextView>(R.id.tv_item) // 修改bindData方法,接收userData参数 fun bindData(type: HomeCatsListResponse.Data.Result, userData: YourDataType) { txtName.text = type.name // 这里可以直接使用传入的userData } } }
注意:把YourDataType替换成userData实际的类型(比如Double、String等)。
方案3:如果userData是全局常量,直接引用
如果ADDRESS_LOCATION_LAT是全局常量(比如在object类或者companion object里定义的),那你可以直接在ViewHolder里引用这个常量,根本不需要依赖Adapter里的userData变量。
内容的提问来源于stack exchange,提问作者DrKingo
相关产品推荐
相关产品推荐

