【问题标题】:keeping viewpager2 item position when navigatiing to other fragment导航到其他片段时保持 viewpager2 项目位置
【发布时间】:2020-08-27 15:12:21
【问题描述】:

我正在使用带有导航组件的 viewpager2。当我单击 viewpager 中的一个项目时,它会转到另一个片段,但是当我使用 viewpager 返回上一个片段时,viewpager 的位置会重置为第一个。导航到其他 Fragment 时如何保持 viewpager 位置?

【问题讨论】:

    标签: android-studio android-viewpager2


    【解决方案1】:

    用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)
    }
    

    【讨论】:

      【解决方案2】:

      完成你想要的最好的方法是拥有一个可以保存你的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)
          }
      
      }
      

      希望对你有帮助!

      【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多