Android databinding RecycleView itemサブコントロールクリックイベント

3293 ワード

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);
                    }
                }
            });

質問1:リストの中で、各行のitemの中に1つのボタンがイベントをクリックする必要があります.itemのクリックとは違います.
半日探しても最後は古い方法で、まず総レイアウトを獲得し、findViewByIdでいいです.
//     
            holder.getBinding().getRoot().findViewById(R.id.btn_edit).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // todo
                }
            });

問題2:xmlでは、このボタンが表示されるか非表示になるかをデータオブジェクトに基づいて決定します.
ネット上で検索されたほとんどは:
android:visibility="@{babyEntity.isSelected ? View.VISIBLE : View.GONE}"
直接コピーして、実行エラーを発見しました.半日検査してやっと思い出した.この言葉にはView関連のAPIが使われています.そこでViewパッケージを導入します.次のようになります.


        

        

    

問題3:画像のロード.
クラスを宣言します.
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ではない人が書いた資料をそのまま書いて、ずっとエラーを実行して、長い時間を無駄にしました.