您的位置:首页 > 移动开发 > Android开发

Android databinding RecycleView item 子控件点击事件

2017-03-13 17:21 891 查看
记录使用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,照着写了一下,一直运行错误,浪费了好长时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐