сохранение позиции элемента viewpager2 при переходе к другому фрагменту

Я использую viewpager2 с компонентом навигации. Когда я нажимаю на один элемент в viewpager, он переходит к другому фрагменту, но когда я возвращаюсь к предыдущему фрагменту с помощью viewpager, позиция viewpager сбрасывается до первого. Как я могу сохранить позицию просмотра при переходе к другому фрагменту?


person Mehranjp73    schedule 11.05.2020    source источник


Ответы (2)


Лучший способ добиться того, чего вы хотите, — это иметь модель просмотра, которая сохранит вашу позицию на странице просмотра.

В вашем фрагменте:


private lateinit var viewModel : TestViewModel

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

viewModel = ViewModelProvider(this).get(TestViewModel::class.java)

#### all other regular fragment stuff still aplies

}


fun setViewPager(){

        ### regular VP2 code here (adapter, etc)

viewModel.viewPagerSelected.observe(viewLifecycleOwner, Observer { page ->
                viewPager.currentItem = page
            })

viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {

            override fun onPageSelected(page: Int) {
                viewModel.updatePageSelected(page)
            }
}

Модель представления

class TestViewModel() : ViewModel() {

    private val _viewPagerSelected = MutableLiveData<Int>()
    val viewPagerSelected: LiveData<Int> = _viewPagerSelected

    fun updatePageSelected(newSelection: Int) {
        _viewPagerSelected.postValue(newSelection)
    }

}

Я надеюсь, что это помогает!

person Henrique Vasconcellos    schedule 12.05.2020
comment
размещается ли viewPager.currentItem = page после установки адаптера/данных? - person Henrique Vasconcellos; 12.05.2020
comment
После. Он работает с viewpager.setCurrentItem(page, false), но viewpager сильно отстает. - person Mehranjp73; 13.05.2020
comment
вы пытались установить флаг в true? Этот флаг относится к плавной прокрутке, в вашем случае это не имеет значения, он все равно должен установить элемент. - person Henrique Vasconcellos; 13.05.2020
comment
Вы используете последнюю версию библиотеки viewpager2? У меня это репо работает нормально, посмотрите github.com/chenriquevz/PokeDex/blob/master/app/src/main/java/ github.com/chenriquevz/PokeDex/blob/master/app/src /главная/java/ - person Henrique Vasconcellos; 13.05.2020

Инициализируйте FragmentStateAdapter с помощью const ItemCount, если позиция, которую вы хотите сохранить, больше, чем ItemCount.

class Adapter(val data: List<String>, fragment: Fragment) : FragmentStateAdapter(fragment) {

    override fun getItemCount(): Int = data.size

    override fun createFragment(position: Int): Fragment {
        return  SubFragment.newInstance(data.get(position))
    }
}

viewModel.subFragment.observe(viewLifecycleOwner){
    Adapter(it,this@fragment)
}
person CTD    schedule 10.06.2021