Проблема
Я пытаюсь смоделировать точное поведение приложения Google Play.
В настоящее время, когда вы прокручиваете категорию, например "Лучшие игры", и вы касаетесь списка, эта ячейка, а также RecyclerView
обрабатывает событие касания, вы можете сказать, что они оба обрабатывают ее из-за появляющейся ряби когда вы держите палец вниз, а также прокручиваетесь, останавливаясь. Или если вы нажмете на ячейку, пока список все еще перемещается, содержимое сразу открывается.
Поведение по умолчанию заключается в том, что прокрутка мгновенно останавливается, если вы поместите свой палец вниз, пока он двигается, и для этого он должен использовать это событие касания, то есть клетка никогда не получает об этом касании. Это невероятно раздражает, когда основное содержимое вашего приложения находится в RecyclerView
, и если пользователь постоянно прокручивает, а затем щелкает по ячейке, он требует, чтобы они дважды щелкнули, поскольку первый клик был поглощен остановкой прокрутки, даже если список едва двигался.
Что я пробовал до сих пор
Сначала я подумал, что внутри RecyclerView
должен быть какой-то флаг, который говорит ему, чтобы он не использовал событие касания. Я просмотрел исходный код Android и направился через документацию по Android безрезультатно.
Затем я попытался захватить событие касания с помощью onInterceptTouchEvent
и вручную сообщить своему представлению, что он был затронут;
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
View myCell = recyclerView.findChildViewUnder(event.getX(), event.getY());
myCell.dispatchTouchEvent(event);
return super.onInterceptTouchEvent(event);
}
Здесь dispatchTouchEvent
, похоже, ничего не сделал, хотя представление, которое я получал, имело соответствующий тег, который я установил в адаптере.
Я пробовал снимать эту проблему с помощью своего пулемета кода под любым углом; играя с requestDisallowInterceptTouchEvent
, вручную вызывая onTouch
и переопределяя все способы прослушивания для RecyclerView
и далее.
Кажется, что ничего не работает. Я уверен, что должно быть элегантное решение, и я просмотрел важную деталь где-то на пути к безумию? Тем более, что собственные приложения Google ведут себя таким образом.
Пожалуйста, помогите!:) Спасибо.
Решение
Благодаря Jagoan Neon найдено решение. Я закончил тем, что закрыл свой ответ внутри пользовательского RecyclerView
для удобства использования.
public class MultiClickRecyclerView extends RecyclerView {
public MultiClickRecyclerView(Context context) {
super(context);
}
public MultiClickRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MultiClickRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && this.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) {
this.stopScroll();
}
return super.onInterceptTouchEvent(event);
}
}