Android 使用FragmentPagerAdapter支持TabLayout在显示以编程方式添加的修改选项卡时出现问题

Android 使用FragmentPagerAdapter支持TabLayout在显示以编程方式添加的修改选项卡时出现问题,android,android-fragments,tabs,android-viewpager,android-tablayout,Android,Android Fragments,Tabs,Android Viewpager,Android Tablayout,编辑:哇,一整天都无法解决这个问题,但在提交并试图找到更多代码放入问题后,我发现了问题,并解决了它。我将改变问题 修复:viewPager.setAdapter(适配器); tabLayout.setupWithViewPager(viewPager) 新问题:由于ViewPager在选项卡上工作正常,我在显示以前显示的相同内容时遇到问题。选项卡A、B、C中的内容显示在选项卡X、Y、Z中,但我希望它是不同的内容。请注意,所有选项卡都使用相同片段的新实例 老问题: 我有一个支持库TabLayout

编辑:哇,一整天都无法解决这个问题,但在提交并试图找到更多代码放入问题后,我发现了问题,并解决了它。我将改变问题

修复
viewPager.setAdapter(适配器);
tabLayout.setupWithViewPager(viewPager)

新问题:由于ViewPager在选项卡上工作正常,我在显示以前显示的相同内容时遇到问题。选项卡A、B、C中的内容显示在选项卡X、Y、Z中,但我希望它是不同的内容。请注意,所有选项卡都使用相同片段的新实例

老问题:

我有一个支持库
TabLayout
,它似乎工作得相当好。在应用加载时,它将加载我想要的选项卡,允许滚动,并更改为正确的片段

我受到了限制,需要修改当前的实现,以切换出选项卡,并根据用户交互将其替换为新选项卡。当我这样做的时候,我开始遇到问题

启动时 将三个选项卡(A、B、C)设置为加载同一片段的新实例(只是一个列表)。它们将显示,所有三个选项卡都可滚动并显示正确的信息

用户交换选项卡交互-问题 拆下三个卡舌并用两个卡舌(X、Y)替换。它们被设置为上面相同片段的新实例。它们是可滚动的,但问题就是从这里开始的

  • 仍显示3个选项卡(A、B、C)
  • 我只能在前两个选项卡(A->X,B->Y)之间滚动
  • 如果我添加了4个以上的选项卡(W、X、Y、Z),那么我将显示3个选项卡,但在滚动到最后一个选项卡时,我会遇到应用程序崩溃
  • 在用户单击时支持库的搜索视图 这里可以在我的应用程序中随时发生。它将向已显示的选项卡添加一个添加选项卡。这始终有效,并添加上述片段的新实例

    正常流量: 1.单击SearchView时,它将在当前选项卡的末尾添加一个新选项卡(搜索)。所有以前的选项卡保持不变。 2.在SearchView关闭时,它将删除所有选项卡,然后仅添加以前的选项卡。这正如预期的那样有效

    如果用户执行交换选项卡交互,则单击SearchView flow 1.拆下以前的卡舌(即A、B、C)并用新卡舌(即X、Y)替换 2.新选项卡将添加到新选项卡的末尾(搜索)。 3.在SearchView关闭时,它将删除所有选项卡,然后仅添加新选项卡(即X、Y)。这正如预期的那样有效

    注意只有当我单击SearchView时,我的选项卡才会正确显示。否则,用户交换选项卡交互上将显示错误的选项卡

    调试时,我发现这是因为只有当我单击SearchView时,它才会以某种方式触发适配器的
    getPageTitle()
    方法。当用户执行交换选项卡交互时,不会调用
    getPageTitle()
    方法,这会导致问题

    我唯一的问题是我无法找到解决这个问题的办法。关于类似的问题,这里有很多问题,但似乎没有一个有效

    我试过的
  • adapter.notifyDataSetChanged()交换选项卡交互后
  • setAdapter(空);设置适配器(适配器)
  • 返回位置\u无
  • forceLayout()
    invalidate()
    ,等等
  • 现在似乎什么都不起作用,但解决方案似乎必须调用
    getPageTitle()
    。那样做,我会很好。唯一的问题是到目前为止我每次都失败了

    代码 碎片翼翼

    public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
    
        private final List<Fragment> fragments = new ArrayList<>(App.getNumberOfApiCalls());
        private final List<String> tabTitles = new ArrayList<>(App.getNumberOfApiCalls());
    
        public ViewPagerFragmentAdapter(final FragmentManager manager) { super(manager); }
    
        public void addFragment(final Fragment fragment, final Downloadable tab) {
    
            fragments.add(fragment);
            tabTitles.add(tab.toString());
    
        }
    
        public void clearTabs() {
    
            fragments.clear();
            tabTitles.clear();
    
        }
    
        @Override
        public int getItemPosition(Object item) {
    
            int index = fragments.indexOf(item);
    
            if (index == -1) return POSITION_NONE;
            return index;
    
        }
    
        @Override
        public Fragment getItem(final int position) { return fragments.get(position); }
    
        @Override
        public int getCount() { return fragments.size(); }
    
        @Override
        public CharSequence getPageTitle(final int position) {
    
            return tabTitles.get(position);
    
        }
    
    }
    
    公共类ViewPagerFragmentAdapter扩展了FragmentPagerDatapter{
    private final List fragments=new ArrayList(App.getNumberOfApiCalls());
    private final List tabTitles=new ArrayList(App.getnumberofapicall());
    公共视图页面碎片适配器(最终碎片管理器){super(管理器);}
    public void addFragment(最终片段,最终可下载选项卡){
    片段。添加(片段);
    tabTitles.add(tab.toString());
    }
    公共无效clearTabs(){
    片段。清除();
    tabTitles.clear();
    }
    @凌驾
    public int getItemPosition(对象项){
    int index=fragments.indexOf(项目);
    如果(索引==-1)返回位置\u无;
    收益指数;
    }
    @凌驾
    公共片段getItem(final int position){return fragments.get(position);}
    @凌驾
    public int getCount(){return fragments.size();}
    @凌驾
    公共字符序列getPageTitle(最终整数位置){
    返回tabTitles.get(位置);
    }
    }
    
    好的,新问题。早上我会把老问题删掉。我要睡觉了嘿,克里斯托弗,我希望你做得好。你愿意关注我的问题吗?我也有同样的问题。好的,新问题。早上我会把老问题删掉。我要睡觉了嘿,克里斯托弗,我希望你做得好。你愿意看看我的问题吗?我也有同样的问题。