Android databinding RecycleView item 子控件点击事件

记录使用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)