Я пробовал все предложения, решения, библиотеки и т. Д., Но они не являются круговыми, и большую часть времени не поддерживают только 3 страницы.
Итак, я реализовал круговой ViewPager
пример с использованием нового ViewPager2
, новый ViewPager
использует RecyclerView
и ViewHolder
s для обработки повторного просмотра и работает как ожидалось!
TLDR: GITHUB
В этом примере будет создаваться одно приложение для занятий с ViewPager2
и FragmentPagerAdapter
, поддерживающее круговую навигацию между 3 страницами или более.
Я использую альфа-версию библиотеки androidx.viewpager2:viewpager2
, но версия 1.0.0-alpha06
является последней из запланированных до того, как Google заморозил API и перешел на бета-версию.
![enter image description here](https://i.stack.imgur.com/2BuRS.gif)
1. Добавьте библиотеку ViewPager2
к зависимостям в вашем build.gradle
dependencies {
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha06'
}
2. Добавьте ViewPager2
представление к вашему проекту:
<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vwpHome"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3. Создайте адаптер FragmentStateAdapter
:
getItemCount()
необходимо вернуть номер huuuuge. (2147483647)
getCenterPage()
возвращает центральную страницу на основе номера huuuuge.
Этот метод используется для получения позиции начальной страницы для установки в ViewPager2
, в этом случае пользователю необходимо провести по ˜1073741823 разу, чтобы достичь конца ViewPager2
.
class CircularPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount() = Integer.MAX_VALUE
/**
* Create the fragment based on the position
*/
override fun createFragment(position: Int) = HomePagerScreens.values()[position % HomePagerScreens.values().size].fragment.java.newInstance()
/**
* Returns the same id for the same Fragment.
*/
override fun getItemId(position: Int): Long = (position % HomePagerScreens.values().size).toLong()
fun getCenterPage(position: Int = 0) = Integer.MAX_VALUE / 2 + position
}
HomeScreens - это ENUM с информацией о странице.
enum class HomePagerScreens(@StringRes val title: Int,
val fragment: KClass<out Fragment>) {
HOME_1(R.string.home_1, FragmentHome::class),
HOME_2(R.string.home_2, FragmentHome::class),
HOME_3(R.string.home_3, FragmentHome::class)
}
4. Установите адаптер для ViewPager
val circularAdapter = CircularPagerAdapter(supportFragmentManager, lifecycle)
vwpHome.apply {
adapter = circularAdapter
setCurrentItem(circularAdapter.getCenterPage(), false)
}