2017-12-12 6 views
0

私のforloopメソッドから、私のonClickメソッドの外にある以下のコードのインデックスにどのようにアクセスできますか? 私のonClickメソッドによってcardViewsがクリックされたときに開くアクティビティを設定できるように、インデックスを取得しようとしています。どうすれば私のonClickMethodの外にあるforloopからインデックスにアクセスできますか?

コード:

private void setSingleEvent(GridLayout mainGrid) { 
    //Create For loop to loop through all child items in grid 
    for(int i=0; i<mainGrid.getChildCount();i++){ 
     //Casting to all cardView items 
     CardView cardView = (CardView)mainGrid.getChildAt(i); 
     final int finalI = i; 
     cardView.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       //Getting new Activity when cardView is clicked 
       if(finalI=0){ 
        Intent genre = new Intent(HomeActivity.this, Genre.class); 
        startActivity(genre); 
       } 
      } 
     }); 
    } 
+0

if(finalI == 0)*。 - タイプミスがあなたの望ましくない結果を引き起こしていると思っています。 – anomeric

+0

これは良いことではありません。 'RecyclerView'を' GridLayout'とともに使用し、そのアダプタに 'onClick'を設定します。 – Kiya

答えて

0

あなたがのonClickメソッド内のインデックスにアクセスする場合、それは最終的でなければならないか、それがグローバルでなければなりませんどちらか。

インデックスはループを駆動しているので、最終的にはできません。ソリューションはインデックスをグローバルにします。

0

これは非常に悪い習慣です。申し訳ありませんが、より良い習慣に従うことを検討すべきです。 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; 

    } 

} 

} 

を実装して拡張しますあなたはバインディング部分とアクションボタンのワイヤーを捨てることができますが、あなたは何をしているのではなく、あなたのクリック操作のためのインタフェースを使用するというイメージを少なくとも得るべきです。

関連する問題