RecyclerView onDoubleClick и onClick

Прочитав решение Джейкоба в 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 предоставят его.


person u2gilles    schedule 14.11.2014    source источник
comment
Вы решили проблему с одиночным и двойным кликом??   -  person New Developer    schedule 12.11.2018


Ответы (2)


используйте метод onSingleTapConfirmed() из GestureListener, чтобы различать singleTap и DoubleTap.

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onSingleTapConfirmed%28android.view.MotionEvent%29

Чтобы обнаружить смахивание влево и вправо, используйте onFling() из GestureListener

внутри onFling используйте следующий код

if(motionEvent.getX() - motionEvent.getX() > SWIPE_MIN_DISTANCE ) { onSwipeRightToLeft(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE ) { onSwipeLeftToRight(); }

person Arvin    schedule 03.12.2014

вы можете использовать ItemTouchHelper добавить поддержку смахивания для закрытия и перетаскивания в RecyclerView.

person zayn    schedule 07.12.2015