ПроблемыПредотвращение RecyclerView от употребления события прикосновения
Я пытаюсь моделировать точное поведение Play приложения Google.
В настоящее время, когда вы прокручиваете категорию, например «Лучшие игры», и вы касаетесь списка, эта ячейка, а также 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 Неон решение было найдено. Я закончил тем, что закрыл свой ответ внутри пользовательского 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);
}
}
Я выполнил ваш ответ сегодня утром, и мы почти у цели! Странно; это решение работает примерно в 30% случаев, в зависимости от того, как медленно я перетаскиваю заранее. Я выхожу из состояния движения и состояния прокрутки, и, похоже, нет разницы с тем, когда он работает, а когда нет. Если я прокручу список быстро, а затем коснувшись пальцем, он почти никогда не регистрирует прикосновение и не показывает пульсацию (как это делает приложение Google Play). Он постоянно работает для вас? Я использую макет сетки с двумя интервалами, хотя я бы не подумал, что это изменит ситуацию. – vguzzi
Вы видели мое второе редактирование? –
Да, сейчас я нахожусь в режиме ожидания просмотра прокрутки. Я также попробовал предыдущие предложения. – vguzzi