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

