2015-01-14 22 views
11

Tôi bắt đầu sử dụng RecyclerView trong Android. Mọi thứ hoạt động tốt cho đến khi tôi triển khai trình xử lý cảm ứng cho bộ điều hợp của mình.OnLongItemNhấp vào RecyclerView

Từ chủ đề này:

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

tôi có thể thực hiện các listener cho childview một cách chính xác. Tuy nhiên, tôi muốn thực hiện cả OnItemClick và OnItemLongClick, sau đó vấn đề xuất hiện. Chúng luôn được bắn cùng một lúc. OnItemClick đầu tiên và OnItemLongClick sau đó, làm cho hàm của tôi vô dụng.

Đây là mã của tôi cho người nghe tùy chỉnh (dựa trên mã trên, nhờ 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) { 
} 

Và đối với việc thực hiện:

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 
})); 

Bạn có bất cứ giải pháp cho điều đó ?

Trả lời

24

Bạn có thể thêm người nghe vào triển khai bộ điều hợp tùy chỉnh của mình. Nó sẽ giống như sau:

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; 
      } 
     }); 
    } 
    . . . 
} 

Định nghĩa giao diện ghi chú ở đầu. Bằng cách này, bạn sẽ chuyển các sự kiện onClick và onLongClick vào phân đoạn của bạn để xử lý. Khá thuận tiện, bạn biết

+0

Xin chào! Có vẻ như cả hai sự kiện vẫn được kích hoạt cùng lúc trong trường hợp của tôi – Souris

+0

Bạn đã xóa (vô hiệu hóa) đối tượng nghe trênTouch của bạn từ chế độ xem tái chế? Bạn không cần chúng. Chỉ cần thực hiện 'RecyclerViewAdapter.OnItemClickListener' và' RecyclerViewAdapter.OnItemLongClickListener' trong hoạt động hoặc đoạn của bạn và ghi đè các phương thức giao diện tương ứng –

+0

Cảm ơn. Nó hoạt động. Tôi chấp nhận giải pháp. : D – Souris