ViewPager2 setCurrentItem 错误解决方法?

ViewPager2 setCurrentItem bug workaround?

这个报告的错误给我带来了麻烦; https://issuetracker.google.com/issues/183847283

与 FragmentStateAdapter 结合使用时,ViewPager2.setCurrentItem 并不总是有效。 TabLayout 正确更改(如果有的话),但 ViewPager2 本身没有显示正确的页面。

有没有人找到解决方法?

我有一个类似的问题,如果不一样的话。解决方案是按特定顺序更改 fragments/tabs/pages

  1. 应该首先通知 FragmentStateAdapter 片段的更改。
  2. 然后 TabLayout 应该在 post
  3. 下调用 selectTab
  4. 然后 ViewPager 应该在 post 下调用 setCurrentItem,在 TabLayouts postselectTab 内调用 setCurrentItem

这可能有点矫枉过正,但对我有用。

示例

//or some other notify depending on your use case.
fragmentStateAdapter.notifyItemInserted(position);

tabLayout.post(()->{
     tabLayout.selectTab(tabLayout.getTabAt(position));
     viewPager2.post(()->{
          viewPager2.setCurrentItem(position);
          //I noticed on older devices like API 19
          //the viewPager wouldn't complete transformations
          //so we call this.
          viewPager2.requestTransform();
     });
});

我是这样解决的:

viewPager.setCurrentItem(tab.getPosition());
                if (tab.getPosition()==0||tab.getPosition()==1||tab.getPosition()==2||tab.getPosition()==3){
                    pagerAdapter.notifyDataSetChanged();
                }