【发布时间】:2020-08-27 15:12:21
【问题描述】:
我正在使用带有导航组件的 viewpager2。当我单击 viewpager 中的一个项目时,它会转到另一个片段,但是当我使用 viewpager 返回上一个片段时,viewpager 的位置会重置为第一个。导航到其他 Fragment 时如何保持 viewpager 位置?
【问题讨论】:
标签: android-studio android-viewpager2
我正在使用带有导航组件的 viewpager2。当我单击 viewpager 中的一个项目时,它会转到另一个片段,但是当我使用 viewpager 返回上一个片段时,viewpager 的位置会重置为第一个。导航到其他 Fragment 时如何保持 viewpager 位置?
【问题讨论】:
标签: android-studio android-viewpager2
用const ItemCount初始化FragmentStateAdapter,我客你要保留的位置大于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)
}
【讨论】:
完成你想要的最好的方法是拥有一个可以保存你的viewpager位置的viewmodel。
在您的片段中:
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)
}
}
希望对你有帮助!
【讨论】:
viewpager.setCurrentItem(page, false),但 viewpager 滞后很多。