Я использую viewpager2 с компонентом навигации. Когда я нажимаю на один элемент в viewpager, он переходит к другому фрагменту, но когда я возвращаюсь к предыдущему фрагменту с помощью viewpager, позиция viewpager сбрасывается до первого. Как я могу сохранить позицию просмотра при переходе к другому фрагменту?
сохранение позиции элемента viewpager2 при переходе к другому фрагменту
Ответы (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
размещается ли viewPager.currentItem = page после установки адаптера/данных?
- person Henrique Vasconcellos; 12.05.2020
После. Он работает с
viewpager.setCurrentItem(page, false)
, но viewpager сильно отстает.
- person Mehranjp73; 13.05.2020
вы пытались установить флаг в true? Этот флаг относится к плавной прокрутке, в вашем случае это не имеет значения, он все равно должен установить элемент.
- person Henrique Vasconcellos; 13.05.2020
Вы используете последнюю версию библиотеки 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