Android databinding RecycleView item 子控件点击事件

记录使用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,照着写了一下,一直运行错误,浪费了好长时间。







  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值