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

Kotlin下Fragment的RecyclerView使用DataBinding出现未解析引用如何解决

解决方案

1. 基础配置检查

确保你模块级的build.gradle已经开启DataBinding,Android Gradle Plugin 7.0+的配置如下:

android {
    buildFeatures {
        dataBinding true
    }
}

配置完成后同步项目,清理缓存再重新构建,避免自动生成的绑定类未更新。

2. 修复XML字段映射错误

你在shopItem.xml中调用的是productModel.available,但ProductModel里的对应字段名是isAvailable,修改XML中的对应属性:

<!-- 原有错误写法 -->
android:text="@{productModel.available? `Available` : `Out of stock`}"
android:enabled="@{productModel.available}"

<!-- 修改为正确写法 -->
android:text="@{productModel.isAvailable? `Available` : `Out of stock`}"
android:enabled="@{productModel.isAvailable}"

补充:你当前的ProductModel的equals方法没有正确重写,建议直接改为data class,会自动生成正确的equals、hashCode、toString方法,DiffUtil判断会更准确:

data class ProductModel(
    var id : Number,
    var name : String,
    var imageUrl : String, 
    var price : Number, 
    var isAvailable : Boolean
) {
    class ShopItemCallBack : DiffUtil.ItemCallback<ProductModel>() {
        override fun areItemsTheSame(oldItem: ProductModel, newItem: ProductModel): Boolean {
            return newItem.id == oldItem.id
        }

        override fun areContentsTheSame(oldItem: ProductModel, newItem: ProductModel): Boolean {
            return newItem == oldItem
        }
    }
}

3. 修复ShopItemAdapter代码

你贴出的ShopItemAdapter.kt错误复制了ProductModel的代码,替换为如下正确的DataBinding适配写法:

class ShopItemsAdapter(val listener: ShopInterface) : ListAdapter<ProductModel, ShopItemsAdapter.ShopItemViewHolder>(ProductModel.ShopItemCallBack()) {

    inner class ShopItemViewHolder(val binding: ShopItemBinding) : RecyclerView.ViewHolder(binding.root)

    interface ShopInterface {
        fun addItem(productModel: ProductModel)
        fun onItemClick(productModel: ProductModel)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ShopItemViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = ShopItemBinding.inflate(inflater, parent, false)
        return ShopItemViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ShopItemViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.binding.apply {
            // 给布局绑定变量赋值
            productModel = currentItem
            // 设置点击事件
            root.setOnClickListener { listener.onItemClick(currentItem) }
            AddBtn.setOnClickListener { listener.addItem(currentItem) }
            // 立刻执行绑定,避免列表滚动时闪烁
            executePendingBindings()
        }
    }
}

注:ShopItemBinding是shop_item.xml对应的自动生成绑定类,命名规则为布局名驼峰化+Binding后缀。

4. 修复Fragment中Adapter初始化逻辑

ShopFragment里初始化Adapter的时候要传入接口实现(也就是Fragment自身):

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 传入this作为回调接口
    shopItemsAdapter = ShopItemsAdapter(this)
    fragmentShopBinding.shopRV.adapter = shopItemsAdapter
    // 后续给Adapter提交数据调用 shopItemsAdapter.submitList(你的产品列表数据)
}

做完以上步骤后清理项目缓存,重新构建即可解决未解析引用的问题。

内容的提问来源于stack exchange,提问作者Aryan Barnwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:04