记录使用databinding遇到的小问题。
前面先介绍一下简单用法,在引出问题。
首先recyclerview中会用到ViewHolder,下面列出一个通用bindViewholder:
public class BindingViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder {
private T mBinding;
public BindingViewHolder(T binding) {
super(binding.getRoot());
mBinding = binding;
}
public T getBinding(){
return mBinding;
}
}
使用时呢,首先在声明类的时候:
public class MyBindAdapter extends RecyclerView.Adapter<BindingViewHolder>
然后onCreateViewHolder方法中
@Override
public BindingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewDataBinding binding;
binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.adapter_my_bind, parent, false);
return new BindingViewHolder(binding);
}
最后就是onBindViewHolder方法了,其他的和正常的adapter写法没有什么差别了。
// 数据
final MyBabyEntity.ResultsBean bean = list.get(position);
// 设置数据
holder.getBinding().setVariable(BR.babyEntity, bean);
// 刷新
holder.getBinding().executePendingBindings();
// item点击
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mListener != null){
mListener.backItemBean(bean, lastPosition, position);
}
}
});
问题一:现在列表中,每一行item中有一个按钮需要点击事件,区别于item的点击。
找了半天最后还是老方法,先获得总布局,在findViewById即可:
// 按钮点击
holder.getBinding().getRoot().findViewById(R.id.btn_edit).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// todo
}
});
问题二:在xml中根据数据对象来决定这个按钮是显示还是隐藏。
网上搜出来大部分都是:
android:visibility="@{babyEntity.isSelected ? View.VISIBLE : View.GONE}"
直接复制过来,发现运行报错。检查半天才想起来。这句话中使用了View相关的API。所以要在<data>中引入View包。即:
<data>
<variable
name="babyEntity"
type="com.ruilai.ge.app.bean.MyBabyEntity.ResultsBean"/>
<import type="android.view.View"/>
</data>
问题三:图片加载。
声明一个类:
public class ImageLoadViewModel {
/**
* 头像加载
* @param view 要加载的view
* @param imageUrl 头像路径
*/
@BindingAdapter({"bind:babyHeadName"})
public static void loadImageFromUrl(ImageView view, String imageUrl){
Glide.with(view.getContext()).load(imageUrl)
// 圆形图片
.bitmapTransform(new CropCircleTransformation(view.getContext()))
.placeholder(R.mipmap.icon_head_img)
.into(view);
}
}
在布局imageview直接使用:
app:babyHeadName="@{babyEntity.imageName}"
注:1.编译的时候会报错但是可以运行,不要害怕。
2.注解名字一定不要弄错,就是(bind:)。一开始用的时候有的人写的资料不是bind,照着写了一下,一直运行错误,浪费了好长时间。