Android RecyclerView使用DataBinding时ItemRowBinding缺失无法导入
问题根因
ItemRowBinding类无法生成/识别是多个代码错误叠加导致的,按影响优先级排序:
- DataBinding布局格式不合法:
<data>标签必须是<layout>根节点的第一个直接子元素,你当前把<data>写在了CardView布局节点之后,编译器完全不会将这个布局识别为DataBinding布局,自然不会生成对应Binding类 - XML存在语法错误:布局里的TextView标签没有闭合,缺少结束的
/>标记,XML编译直接失败,阻断了Binding类的生成流程 - 导包路径完全错误:DataBinding生成的Binding类默认路径为
[应用包名].databinding.[布局名驼峰形式]Binding,你写的com.main.databinding.databinding.ItemRowBinding多嵌套了两层无意义的databinding目录,按你代码里的模型类路径,应用包名应为com.main.bawmlabu,正确导包路径是com.main.bawmlabu.databinding.ItemRowBinding - 代码引用与XML定义不匹配:XML中声明的数据变量名为
model,你在Adapter的bind方法里用了BR.modelClass,BR字段不存在也会导致编译失败 - 存在拼写错误:XML里引用的点击监听类名写为
CustomCliskListener(正确应为CustomClickListener),如果对应类名本身拼写不匹配,也会阻断编译 - 未确认DataBinding开关:如果模块级build.gradle没有开启DataBinding编译开关,所有Binding类都不会生成
修复步骤
- 先确认开启DataBinding配置,在app模块的build.gradle的android配置块中加入以下内容,同步Gradle:
android { // 其他原有配置保持不变 buildFeatures { dataBinding true } }
- 修正item_row.xml的结构,将
<data>节点移到最前,补全未闭合的标签,修正拼写错误,修正后代码如下:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="model" type="com.main.bawmlabu.models.Model" /> <variable name="itemClickListener" type="com.main.bawmlabu.models.CustomClickListener" /> </data> <androidx.cardview.widget.CardView android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{() -> itemClickListener.cardClicked(model)}" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{model.title}"/> </androidx.cardview.widget.CardView> </layout>
注意:如果你的Model类里的标题字段确实命名为tittle,就保留
@{model.tittle},否则改成和实体类字段一致的名称
- 修正Adapter代码,替换错误导包,修正BR引用,核心代码如下:
// 删掉原来错误的导包语句,换成正确的 import com.main.bawmlabu.databinding.ItemRowBinding; @NonNull @Override public RecylcerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ItemRowBinding binding = DataBindingUtil.inflate( LayoutInflater.from(parent.getContext()), R.layout.item_row, parent, false); return new ViewHolder(binding); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Model model = modelClassList.get(position); holder.bind(model); holder.itemRowBinding.setItemClickListener(this); } public class ViewHolder extends RecyclerView.ViewHolder { public ItemRowBinding itemRowBinding; public ViewHolder(ItemRowBinding itemRowBinding) { super(itemRowBinding.getRoot()); this.itemRowBinding = itemRowBinding; } public void bind(Object obj) { // 把BR.modelClass改成和XML变量名一致的BR.model itemRowBinding.setVariable(BR.model, obj); itemRowBinding.executePendingBindings(); } }
- 所有修改完成后,依次点击Android Studio菜单栏的
Build -> Clean Project,等待清理完成后再点击Build -> Rebuild Project,编译完成后ItemRowBinding就会正常生成,不会再报找不到类的错误。
内容的提问来源于stack exchange,提问作者Uncle Roger
相关产品推荐
相关产品推荐

