ViewPager2 setCurrentItem 错误解决方法?
ViewPager2 setCurrentItem bug workaround?
这个报告的错误给我带来了麻烦;
https://issuetracker.google.com/issues/183847283
与 FragmentStateAdapter 结合使用时,ViewPager2.setCurrentItem 并不总是有效。 TabLayout 正确更改(如果有的话),但 ViewPager2 本身没有显示正确的页面。
有没有人找到解决方法?
我有一个类似的问题,如果不一样的话。解决方案是按特定顺序更改 fragments
/tabs
/pages
。
- 应该首先通知
FragmentStateAdapter
片段的更改。
- 然后
TabLayout
应该在 post
下调用 selectTab
- 然后
ViewPager
应该在 post
下调用 setCurrentItem
,在 TabLayouts post
到 selectTab
内调用 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();
}
这个报告的错误给我带来了麻烦; https://issuetracker.google.com/issues/183847283
与 FragmentStateAdapter 结合使用时,ViewPager2.setCurrentItem 并不总是有效。 TabLayout 正确更改(如果有的话),但 ViewPager2 本身没有显示正确的页面。
有没有人找到解决方法?
我有一个类似的问题,如果不一样的话。解决方案是按特定顺序更改 fragments
/tabs
/pages
。
- 应该首先通知
FragmentStateAdapter
片段的更改。 - 然后
TabLayout
应该在post
下调用 - 然后
ViewPager
应该在post
下调用setCurrentItem
,在 TabLayoutspost
到selectTab
内调用setCurrentItem
。
selectTab
这可能有点矫枉过正,但对我有用。
示例
//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();
}