Android databinding RecycleView itemサブコントロールクリックイベント
3293 ワード
databindingを使用して発生した小さな問題を記録します.
先に簡単な使い方を紹介して、問題を引き出しています.
まずrecyclerviewではViewholderが使用されます.次に、汎用bindViewholderを示します.
使用する場合は、まずクラスを宣言するとき:
そしてonCreateViewHolderメソッドで
最後にonBindViewHolderメソッドですが、他は通常のadapterの書き方と変わらないです.
質問1:リストの中で、各行のitemの中に1つのボタンがイベントをクリックする必要があります.itemのクリックとは違います.
半日探しても最後は古い方法で、まず総レイアウトを獲得し、findViewByIdでいいです.
問題2:xmlでは、このボタンが表示されるか非表示になるかをデータオブジェクトに基づいて決定します.
ネット上で検索されたほとんどは:
問題3:画像のロード.
クラスを宣言します.
レイアウトimageviewで直接使用:
注意:1.コンパイル時にエラーが表示されますが、実行できます.怖がらないでください.
2.注釈の名前を間違えないでください.最初に使ったときにbindではない人が書いた資料をそのまま書いて、ずっとエラーを実行して、長い時間を無駄にしました.
先に簡単な使い方を紹介して、問題を引き出しています.
まず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ではない人が書いた資料をそのまま書いて、ずっとエラーを実行して、長い時間を無駄にしました.