Под капотом ViewPager2
работает с RecyclerView
для надувания фрагментов, но RecyclerView
скрыто, что делает его более идиотским.
val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)
Хакерский способ - перевести ребенка в нулевую позицию, которая является RecyclerView
, и отключить прокрутку в менеджере раскладок, добавив менеджер раскладок:
inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout) {
override fun canScrollVertically(): Boolean = layoutManager.orientation == HORIZONTAL
override fun canScrollHorizontally(): Boolean = layoutManager.orientation == VERTICAL
}
Пожалуйста, будьте осторожнычто если API изменит менеджер размещения, используемый для RecyclerView, то есть они отойдут от LinearLayoutManager
, это не сработает, и ему потребуется переопределить некоторые методы и обеспечить вызов супер-методов.
Вторым подходом является подкласс ViewPager2
, который равен ViewGroup
, и затем выполняется волшебство при перехвате событий касания, прежде чем они будут отправлены дочерним представлениям (как вы могли бы догадаться RecyclerView
) и будьте осторожны.не предотвращать щелчки.