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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:43