使用FragmentPagerAdapter支持TabLayout时出现问题,显示已逐步添加的已修改标签

时间:2015-07-25 14:55:44

标签: android android-fragments tabs android-viewpager android-tablayout

编辑:哇,无法整天解决问题,但提交后不久,并尝试在问题中找到更多代码,我发现了问题并修复了问题它。我会改变这个问题。

FIX viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager);

新问题:在ViewPager正常使用标签的情况下,我遇到的问题是显示之前显示的相同内容。选项卡A,B,C中的内容显示在选项卡X,Y,Z中,但我希望它是不同的内容。请注意,所有选项卡都使用相同片段的新实例。

旧问题:

我有一个支持库TabLayout似乎运行得相当不错。在App加载时,它将加载我想要的选项卡,允许滚动,并更改为正确的片段。

我受到限制,需要修改我当前的实现以切换标签,并根据用户互动将其替换为新标签。当我这样做时,我开始遇到问题。

启动时 设置三个选项卡(A,B,C)以使用相同片段的新实例(仅列表)加载。它们会显示出来,并且所有三个选项卡都可以滚动并显示正确的信息。

在用户交换选项卡上进行交互 - 问题 删除三个选项卡并替换为两个选项卡(X,Y)。它们被设置为上面相同片段的新实例。它们是可滚动的,但这就是问题的起点。

  1. 仍有3个标签显示(A,B,C)
  2. 我只能在前两个标签之间滚动(A - > X,B - > Y)。
  3. 如果我添加了4个以上的标签(W,X,Y,Z),那么我会显示3个标签,但是我会在滚动到最后一个标签时遇到应用程序崩溃。
  4. 用户点击支持库的SearchView 这可以在我的应用程序中随时发生。它将为已显示的选项卡添加一个附加选项卡。这总是有效,并添加了上述片段的新实例。

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

    如果用户执行了swap-tabs交互,则单击SearchView流  1.删​​除先前的选项卡(即A,B,C)并替换为新选项卡(即X,Y)  2.新选项卡将添加到新选项卡的末尾(搜索)。  3.在SearchView关闭时,它将删除所有选项卡,然后仅添加新选项卡(即X,Y)。这可以按预期工作。

    注意仅当我点击SearchView时,我的标签才能正确显示。否则,用户交换选项卡交互上会显示错误的选项卡。

    调试时,我发现发生这种情况是因为只有当我点击SearchView时才会触发我的适配器getPageTitle()方法。当用户执行交换选项卡交互时,不会调用getPageTitle()方法,并且可以解决问题。

    我唯一的问题是我无法找到解决此问题的方法。这里有很多关于类似问题的问题,但它们似乎都没有用。

    我尝试了什么

      交换标签交互后
    1. adapter.notifyDataSetChanged();
    2. setAdapter(null); setAdapter(adapter);
    3. return POSITION_NONE;
    4. forceLayout()invalidate()等等......
    5. 现在似乎没什么用,但解决方案似乎必须调用getPageTitle()。那样做,我应该是好的。唯一的问题是我到目前为止每次都失败了

      代码

      FragmentPagerAdapter

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

0 个答案:

没有答案