これは非常に悪い習慣です。申し訳ありませんが、より良い習慣に従うことを検討すべきです。 Clickリスナは、インターフェイス経由で行うことができ、アダプタクラスの中に入れて、bindViewルーチンで配線することができます。次に、呼び出し元のフラグメントまたはアクティビティでインターフェイスを実装するだけです。アダプターのパラメーターの1つとして渡します。
以下は、すべてではないにしてもほとんどのリサイクラー・ビューで使用する汎用バインディング・アダプターの例です。グリッドはリサイクラビューの別の形式なので、私はそれを使っています。
/** * * 2011年5月23日にApp Studio 35によって作成されました。 、
extends BaseFragment implements IBindingRecyclerView
/*///////////////////////////////////////////////////////////////
// BINDING ADAPTER OVERRIDES
*////////////////////////////////////////////////////////////////
@Override
public int getRowLayoutResourceId() {
return R.layout.card_person;
}
@Override
public int getBindingModelId() {
return BR.personModel;
}
@Override
public void onItemClick(Object model, int position) {
startViewIDsForPersonActivity((PersonModel) model);
}
@Override
public void onItemLongClick(Object model, int position) {
final PersonModel personModel = (PersonModel) model;
DialogInterface.OnClickListener delete = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deletePerson(personModel);
}
};
mIBaseActivityCallback.showDialogMessage(personModel.getFullName(), getString(R.string.confirm_delete_of_person), delete, cancel);
}
@Override
public void onActionItemClick(Object model, int position) {
}
@Override
public int getActionButtonResourceId(){
return -1;
}
もちろん、これはあなたのための過剰です: */ パブリッククラスBindingRecyclerViewAdapterはRecyclerView.Adapterは、その後、あなたのクラスであなたができるView.OnClickListener、View.OnLongClickListener {
/*///////////////////////////////////////////////////////////////
// MEMBERS
*////////////////////////////////////////////////////////////////
private static String TAG = Globals.SEARCH_STRING + BindingRecyclerViewAdapter.class.getSimpleName();
private int MODEL_TAG = -124;
private int MODEL_POSITION_TAG = -125;
private int mRowLayoutResourceId;
private int mBindingModelId;
private int mActionButtonId;
private boolean mHasActionButton;
private ObservableArrayList<T> mList;
private IBindingRecyclerView mIBindingRecyclerView;
/*///////////////////////////////////////////////////////////////
// PROPERTIES
*////////////////////////////////////////////////////////////////
/**
* This is now how the interface needs to be set. This is taken care of in the @BindingAdapter
* method "bind:rcvInterface" (BindingAdapterMethods). I also decided to take care of setting the
* rowLayoutResourceId here, more as a "might as well" sort of thing, but also preventing the chance
* of a null ref exception if we were to use mIBindingRecyclerView.getRowLayoutResourceId() and
* mIBindingRecyclerView was null. Same goes for bindingModelId.
* @param iBindingRecyclerView
*/
public void setIBindingRecyclerView(IBindingRecyclerView iBindingRecyclerView) {
mIBindingRecyclerView = iBindingRecyclerView;
mRowLayoutResourceId = iBindingRecyclerView.getRowLayoutResourceId();
mBindingModelId = iBindingRecyclerView.getBindingModelId();
mActionButtonId = iBindingRecyclerView.getActionButtonResourceId();
mHasActionButton = mActionButtonId > 0;
}
/**
* This is how the list is set and any changes made will be notified here. If notifyDataSetChanged()
* is not called here, then the view will not be updated with the list changes. Setting the list gets
* taken care of in the @BindingAdapter method "bind:rcvList" (BindingAdapterMethods). Anytime the list
* changes in the activity/fragment, it will trigger the "bind:rcvList" method, and that will call
* setList(), thus updating the list and notifying data set changed which updates the view properly.
* @param list
*/
public void setList(ObservableArrayList list) {
mList = list;
notifyDataSetChanged();
}
/*///////////////////////////////////////////////////////////////
// BASE CLASS OVERRIDES
*////////////////////////////////////////////////////////////////
@Override
public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
ViewDataBinding viewDataBinding = DataBindingUtil.inflate(inflater, mRowLayoutResourceId, parent, false);
return new BindingHolder(viewDataBinding);
}
@Override
public void onBindViewHolder(BindingHolder holder, int position) {
T model = mList.get(position);
holder.binding.setVariable(mBindingModelId, model);
holder.binding.setVariable(BR.AMEnvironment, AMEnvironment.getInstance());
holder.binding.getRoot().setTag(MODEL_TAG, model);
holder.binding.getRoot().setTag(MODEL_POSITION_TAG, position);
holder.binding.getRoot().setOnClickListener(this);
holder.binding.getRoot().setOnLongClickListener(this);
if(mHasActionButton){
View btnAction = holder.binding.getRoot().findViewById(mActionButtonId);
btnAction.setTag(MODEL_TAG, model);
btnAction.setTag(MODEL_POSITION_TAG, position);
btnAction_onClick(btnAction);
}
holder.binding.executePendingBindings();
}
@Override
public int getItemCount() {
return mList.size();
}
/*///////////////////////////////////////////////////////////////
// CLICK LISTENERS
*////////////////////////////////////////////////////////////////
@Override
public void onClick(View v) {
if(mIBindingRecyclerView != null){
T model = (T) v.getTag(MODEL_TAG);
int position = (int) v.getTag(MODEL_POSITION_TAG);
mIBindingRecyclerView.onItemClick(model, position);
}
}
@Override
public boolean onLongClick(View v) {
if(mIBindingRecyclerView != null){
T model = (T) v.getTag(MODEL_TAG);
int position = (int) v.getTag(MODEL_POSITION_TAG);
mIBindingRecyclerView.onItemLongClick(model, position);
}
return true;
}
public void btnAction_onClick(View btnAction){
btnAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
T model = (T) v.getTag(MODEL_TAG);
int position = (int) v.getTag(MODEL_POSITION_TAG);
mIBindingRecyclerView.onActionItemClick(model, position);
}
});
}
/*///////////////////////////////////////////////////////////////
// SCOPED CLASSES
*////////////////////////////////////////////////////////////////
public static class BindingHolder extends RecyclerView.ViewHolder {
// MEMBERS
public ViewDataBinding binding;
// CONSTRUCTOR
public BindingHolder(ViewDataBinding viewDataBinding) {
super(viewDataBinding.getRoot());
binding = viewDataBinding;
}
}
}
を実装して拡張しますあなたはバインディング部分とアクションボタンのワイヤーを捨てることができますが、あなたは何をしているのではなく、あなたのクリック操作のためのインタフェースを使用するというイメージを少なくとも得るべきです。
if(finalI == 0)*。 - タイプミスがあなたの望ましくない結果を引き起こしていると思っています。 – anomeric
これは良いことではありません。 'RecyclerView'を' GridLayout'とともに使用し、そのアダプタに 'onClick'を設定します。 – Kiya