听说Databinding比findViewById的效率要高,决定试试,发现俩坑:
门栏
启用Databinding只需要gradle文件开启databinding即可。gradle会自动添加相关的工具链、运行时。
android { buildFeatures { dataBinding{ enabled true } } }
在layout中只需将原来的layout用一层<layout></layout>包裹起来:
test_layout.layout
<layout>
……
</layout>
然后Java端就可以这样调用:
TestLayoutBinding viewHolderData = TestLayoutBinding .inflate(getLayoutInflater(), parent, false);
配合recyclerView:
class ViewDataHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder{
T data;
ViewDataHolder(T data){
super(data.getRoot());
this.data = data;
}
}
public ViewDataHolder<TestLayoutBinding> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
TestLayoutBinding vh = TestLayoutBinding.inflate(getLayoutInflater(), parent, false);
return new ViewDataHolder(vh);
}
public void onBindViewHolder(@NonNull ViewDataHolder<TestLayoutBinding> viewHolder, int position) {
TestLayoutBinding viewHolderData = viewHolder.data;
……
}
其中 TestLayoutBinding 是根据layout文件名自动生成的类名,再比如 activity_main.layout 生成的类就是 ActivityMainBinding.java:
ActivityMainBinding UIData = DataBindingUtil.setContentView(this, R.layout.activity_main);
生成的类路径位于:
project\app\build\generated\data_binding_base_class_source_out\debug\out\包\名\databinding\
以上便是用DataBinding替代findViewById的方法。坑点在于,有不少过时的教程,抟聚浮云。
冲突
databinding工具链包含了com.google.common、com.google.code.gson
等包,可能会引发重复类冲突。
比如本人在一个annotationProcesser模块中引入了google closure compiler,用于编译代码中包含的一些Javascript字符串。但此包内含了gson
的一些类。
坑点在于,当以annotationProcesser间接引入google closure compiler的时候,Android Studio根本不告诉我是类冲突,更别说是哪个模块哪个引用引发了问题,它它它仅仅是告诉我找不到gson
这个类。改成以api引入后,它才开始抱怨类冲突。
解决:winrar打开jar包,删除其中包含gson
代码的子文件夹。
网友评论