Я пробовал все предложения, решения, библиотеки и т. Д., Но они не являются чисто круговыми и в большинстве случаев не поддерживают только 3 страницы.
Итак, я реализовал круговой пример ViewPager
, используя новый ViewPager2
, новый ViewPager
использует RecyclerView
и ViewHolder
s для обработки повторного использования представлений и работает так, как ожидалось!
TL; DR: GITHUB
В этом примере будет создано приложение с одним действием с ViewPager2
и FragmentPagerAdapter
, поддерживающим круговую навигацию между 3 страницами или более.
Я использую альфа-версию библиотеки androidx.viewpager2:viewpager2
, но версия 1.0.0-alpha06
- последняя из запланированных перед тем, как Google заморозит API и перейдет на бета-версию.
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()
нужно вернуть огромное число. (2147483647)
getCenterPage()
возвращает центральную страницу на основе огромного числа. Этот метод используется для определения позиции начальной страницы в 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)
}
person
extmkv
schedule
12.07.2019
ViewPager
, но вы можете попробовать изменитьFragmentStatePagerAdapter.instantiateItem
, чтобы использовать некоторую математику модуля для загрузки правильного фрагмента. Вам нужно будет переопределитьgetCount
, чтобы вернуть достаточно большое число. - person tad   schedule 03.10.2011ViewPager.mCurPos
является частным ... - person dcow   schedule 03.04.2013