2015-01-14 9 views
11

AndroidでRecyclerViewを使い始めました。アダプタにタッチリスナーを実装するまでは問題なく動作します。このトピックからRecyclerViewのOnLongItemClick

https://stackoverflow.com/a/26826692/2923403

私が正しくchildviewのリスナーを実装することができます。しかし、OnItemClickとOnItemLongClickの両方を実装したいのですが、問題が発生します。彼らは常に同時に解雇されます。最初はOnItemClick、それ以降はOnItemLongClickを使用すると、関数が役に立たなくなります。ここで

は、(上記のコードに基づいて、のFouadのおかげで)カスタムリスナーのための私のコードです:

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

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

    public void onItemLongClick(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 childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

      if (childView != null && mListener != null) { 
       mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView)); 
      } 
     } 

    }); 
} 

@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.getChildPosition(childView)); 
     return true; 
    } 
    return false; 
} 

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

と実装のために:

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { 
@Override 
public boolean onItemClick(View view, int position) { 
//This is fired 1st 
} 
@Override 
public void onItemLongClick(View view, int position) { 
//This comes later 
})); 

あなたはそのためのすべてのソリューションを持っていますか?

答えて

24

カスタムアダプター実装でリスナーを追加できます。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

    public interface OnItemClickListener { 
     public void onItemClicked(int position); 
    } 

    public interface OnItemLongClickListener { 
     public boolean onItemLongClicked(int position); 
    } 

    private Fragment mFragment; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public View v; 

     public ViewHolder(View v) { 
      super(v); 
      this.v = v; 
     } 
    } 

    public RecyclerViewAdapter(Fragment fragment) { 
     mFragment = fragment; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     holder.v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mFragment.onItemClicked(position); 
      } 
     }); 
     holder.v.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       mFragment.onItemLongClicked(position); 
       return true; 
      } 
     }); 
    } 
    . . . 
} 

注:インターフェイスの定義は最初です。この方法で、onClickとonLongClickイベントをフラグメントに渡して処理します。かなり多くの便利な、あなたは

+0

Hi.Itはまだあなたがあなたのリサイクルビューから(無効)onTouchリスナーを削除しました私の場合 – Souris

+0

に同時に発射両方のイベントのように見えます知っていますか?あなたはそれらを必要としません。あなたのアクティビティやフラグメントに 'RecyclerViewAdapter.OnItemClickListener'と' RecyclerViewAdapter.OnItemLongClickListener'を実装して、それぞれのインターフェイスメソッドをオーバーライドしてください。 –

+0

ありがとうございます。できます。私は解決策を受け入れた。 :D – Souris

関連する問題