Прочитав решение Джейкоба в RecyclerView onClick question, я попытался расширить его решение для события "Двойной щелчок". Когда я регистрирую recyclerview для слушателей щелчка и двойного щелчка, onDoubleClick() вызывается правильно, но onClick() также вызывается, когда пользователь дважды щелкает, чего я хочу избежать. Я хочу, чтобы при обнаружении события двойного щелчка событие одиночного щелчка не обнаруживалось.
Ниже приведен код моего прослушивателя двойного щелчка, адаптированный из решения Джейкоба:
public class RecyclerItemDoubleClickListener implements RecyclerView.OnItemTouchListener {
private OnItemDoubleClickListener doubleClickListener;
public interface OnItemDoubleClickListener {
public void onItemDoubleClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemDoubleClickListener(Context context, OnItemDoubleClickListener listener) {
doubleClickListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onDoubleTap(MotionEvent e) {
return true;
}
});
}
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && doubleClickListener != null && mGestureDetector.onTouchEvent(e)) {
doubleClickListener.onItemDoubleClick(childView, view.getChildPosition(childView));
}
return false;
}
@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
}
И я просто регистрируюсь так:
recyclerView.addOnItemTouchListener(new RecyclerItemDoubleClickListener(
this, new RecyclerItemDoubleClickListener.OnItemDoubleClickListener() {
@Override
public void onItemDoubleClick(View view, int position) {
Toast.makeText(ActivityMain.this, "double click " + position, Toast.LENGTH_SHORT).show();
}
}));
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(
this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(ActivityMain.this, "single click " + position, Toast.LENGTH_SHORT).show();
}
}));
Как бы вы справились с этим?
PS: я также хотел бы независимо обнаруживать «longClick», «проведите пальцем влево», «проведите пальцем вправо» по одному и тому же элементу recyclerview. Но я думаю, что это, возможно, слишком много, чтобы кодировать самому. Я подожду, пока библиотеки или Google предоставят его.