У меня есть приложение, в котором мне нужно отобразить несколько RecyclerView
внутри ConstraintLayout
внутри NestedScrollView
внутри SwipeRefreshLayout
.
Все RecyclerView
имеют LinearLayoutManager
с горизонтальной ориентацией.
Итак, мое текущее дерево макетов выглядит следующим образом:
<SwipeRefreshLayout>
<NestedScrollView>
<ConstraintLayout>
<RecyclerView></RecyclerView>
<RecyclerView></RecyclerView>
<RecyclerView></RecyclerView>
...
</ConstraintLayout>
</NestedScrollView>
</SwipeRefreshLayout>
То, чего я пытаюсь добиться, похоже на то, что приложение Google Play имеет на главном экране.
Моя проблема в том, что RecyclerView
s слишком требовательны к тому, что можно считать горизонтальным движением.
Я пытался setNestedScrollingEnabled(false)
, но безрезультатно.
Затем я начализучить onTouch()
методы всего выше RecyclerView
s, и я обнаружил, что ACTION_DOWN
из MotionEvent
появляется, только если я прокручиваю очень медленно - что-либо, что можно считать смахиванием / броском, не производит ACTION_DOWN
, только ACTION_MOVE
и ACTION_UP
.
Что-то я не знаю об этой конструкции?Какой-то вид потребляет ACTION_DOWN
?
И дополнительный вопрос - есть ли примеры воссоздания не только внешнего вида главного экрана Google Play, но и ощущения?Их горизонтальные списки гораздо проще, когда дело доходит до горизонтальной прокрутки.
РЕДАКТИРОВАТЬ: Добавил OnItemTouchListener
ко всем моим RecyclerView
с.Он правильно перехватывает ВСЕ пролистывания / сбрасывания / прокрутки, но не все запускают OnSwipeListener.Вот кодПримечание: OnSwipeListener взят из этого ответа с небольшим добавлением onScroll
метода
public class MyOnItemTouchListener extends RecyclerView.SimpleOnItemTouchListener {
private GestureDetectorCompat mDetector;
private OnSwipeListener mListener = new OnSwipeListener() {
@Override public boolean onSwipe(Direction direction) {
Log.d("Tag", "OnItemListener direction=" + direction);
return super.onSwipe(direction);
}
};
public HomeOnItemTouchListener(Context context) {
mDetector = new GestureDetectorCompat(context, mListener);
}
@Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
Log.d("Tag", "OnItemListener intercept MotionEvent=" + e);
mDetector.onTouchEvent(e);
return super.onInterceptTouchEvent(rv, e);
}
@Override public void onTouchEvent(RecyclerView rv, MotionEvent e) {
Log.d("Tag", "OnItemListener onTouch MotionEvent=" + e);
mDetector.onTouchEvent(e);
super.onTouchEvent(rv, e);
}
}