Android(安卓)databinding RecycleView item 子控件点击事件
16lz
2021-01-24
记录使用databinding遇到的小问题。
前面先介绍一下简单用法,在引出问题。
首先recyclerview中会用到ViewHolder,下面列出一个通用bindViewholder:
public class BindingViewHolder 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
然后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。所以要在中引入View包。即:
问题三:图片加载。
声明一个类:
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,照着写了一下,一直运行错误,浪费了好长时间。
更多相关文章
- 菜鸟学Android开发系列之:发送短信拨打电话
- Android输入输出系统之TouchEvent流程
- Android长按弹出菜单
- 求 在独立service 中 调用contentprovider的方法
- Android打开摄像头拍照,并显示出来
- Android实现系统打印功能
- Android(安卓)中的BroadCastReceiver
- Android(安卓)- Handler is abstract, cannot be instantiated.
- Android(安卓)列表按照时间排序