2016-09-17 10 views
5

テキストビューと2つのイメージビューを含むrecyclerViewがあります。RecyclerViewをその行の項目クリックリスナーとその内部のビューの両方で処理する方法

ユーザーが各画像ビューをクリックしたときに、ユーザーが各行と別のタスクをクリックしたときにタスクを実行したいと思いますが、同時にそのうちの1つしか処理できません。

recylerview.addOnItemTouchListenerを設定した場合、ユーザーがイメージビューをクリックして行のクリックリスナーがトリガーするため、画像ビューonclicksをアダプタでclicklistenerに設定して処理できません。

コードの下

はリサイクルビュー項目

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 

    public void onLongItemClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && mListener != null) { 
       mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child)); 
      } 
     } 
    }); 
} 

@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     return true; 
    } 
    return false; 
} 

@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } 

@Override 
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){} 

を処理するための私のクラスであり、これはアダプタ

public MyViewHolder(View view) { 
      super(view); 
      tv_word = (TextView) view.findViewById(R.id.tv_word_show); 
      tv_english = (TextView) view.findViewById(R.id.tv_english_show); 
      tv_translation = (TextView) view.findViewById(R.id.tv_tranlation_show); 
      tv_numbershow = (TextView) view.findViewById(R.id.tv_numershow); 
      fav = (ImageView) view.findViewById(R.id.iv_fav); 
      more = (ImageView) view.findViewById(R.id.iv_more); 
      fav.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast.makeText(mContext,"show some text for test",Toast.LENGTH_LONG).show(); 
       } 
      }); 

内部の私のホルダーである私は私の問題

答えて

5

のための任意の助けに感謝あなたにインターフェイスを作成します。アダプタクラス。

public void setClickListener(ClickListener clickListener) { 
      this.clickListener = clickListener; 
     } 

     public interface ClickListener { 
      void ItemClicked(View v, int position); 
     } 

このような上にオブジェクトを宣言します。

ClickListener clickListener; 

holder.view.setOnclickListener(new OnclickListener( 
@Override 
     public void onClick(View v) { 
      if (clickListener != null) { 
       clickListener.ItemClicked(v, getAdapterPosition()); 
      } 
     } 
); 

はクラスでこのインターフェイスを実装し、あなたがrecyclerviewにアダプタを設定しているclicklistenerをintialize。

あなたはメソッド次取得するクラスでこれを実装する
adapter.setClickListener(this); 

@Override 
    public void ItemClicked(View v, int position) { 

    } 

はあなたが実装する必要があるなど、多くのクリックリスナーを扱うことができるv.getId()からスイッチケースを適用します。

+0

こんにちは、私の質問に答えるためPreetika KaurさんののTaNxは、私はそれのアイデアを得たが、私はholder.view.setOnclickListener(新しいOnclickListener( @Override ます。public void onClickの(ビューV){ かの宣言shoudはどこで取得できませんでした(!clickListener = NULL){ clickListener.ItemClicked(V、getAdapterPosition()); } } );私のアダプタで –

+0

はい、あなたはbindviewholder上のアダプタのビューでこれを追加する必要があります()親切に答えをupvoteそれがあなたに役立つならば –

+0

tanxもう一度私はそれを見てすぐにあなたのansewerをupvotedしかし、私はなぜそれがdosenを示すのかわからない:(それは15未満の評判でthosによって投げられた投票が記録されているがn変更後の公開ポストスコアを表示します。 ty any wayy –

関連する問題