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 đó ?
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
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 –
Cảm ơn. Nó hoạt động. Tôi chấp nhận giải pháp. : D – Souris