编辑:哇,一整天都无法解决这个问题,但是在提交后不久,并试图找到更多代码放入问题中,我发现了问题并修复了它。我会换个问题。
修复:viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
新问题:随着 ViewPager 与选项卡一起正常工作,我在显示与之前显示的相同内容时遇到问题。选项卡 A、B、C 中的内容显示在选项卡 X、Y、Z 中,但我希望它是不同的内容。请注意,所有选项卡都使用相同片段的新实例。
老问题:
我有一个TabLayout
似乎运行良好的支持库。在应用程序加载时,它将加载我想要的选项卡,允许滚动并更改为正确的片段。
我受到了限制,需要修改我当前的实现以根据用户交互切换选项卡并用新选项卡替换它们。当我这样做时,我开始遇到问题。
在启动时, 三个选项卡(A、B、C)设置为加载相同片段的新实例(只是一个列表)。它们会显示出来,并且所有三个选项卡都可以滚动并显示正确的信息。
在用户交换选项卡交互 - ISSUE 三个选项卡被删除并替换为两个选项卡(X,Y)。它们被设置为上面相同片段的新实例。它们是可滚动的,但这是问题开始的地方。
- 仍然显示 3 个选项卡(A、B、C)
- 我只能在前 2 个选项卡(A -> X,B -> Y)之间滚动。
- 如果我添加了 4 个以上的选项卡(W、X、Y、Z),那么我将显示 3 个选项卡,但在滚动到最后一个选项卡时会出现应用程序崩溃。
用户点击支持库的 SearchView Here 可以在我的应用程序中随时发生。它将向已显示的选项卡添加一个附加选项卡。这始终有效并添加了上述片段的新实例。
正常流程: 1. 在 SearchView 单击时,它将在当前选项卡的末尾添加一个新选项卡(搜索)。所有以前的选项卡保持不变。2. 在 SearchView 关闭时,它将删除所有选项卡,然后仅添加以前的选项卡。这按预期工作。
如果用户执行交换选项卡交互然后单击 SearchView 流程 1. 以前的选项卡(即 A、B、C)被删除并替换为新选项卡(即 X、Y) 2. 一个新选项卡将添加到末尾的新标签(搜索)。3. 在 SearchView 关闭时,它将删除所有选项卡,然后仅添加新选项卡(即 X、Y)。这按预期工作。
请注意,只有当我单击 SearchView 时,我的选项卡才能正确显示。否则,用户交换选项卡交互时会显示错误的选项卡。
调试时,我发现会发生这种情况,因为只有当我单击 SearchView 时才会以某种方式触发我的适配器getPageTitle()
方法。当用户执行交换选项卡交互时,getPageTitle()
不会调用该方法,这会导致问题。
我唯一的问题是我无法找到解决此问题的方法。这里有很多关于类似问题的问题,但似乎没有一个有效。
我试过的
adapter.notifyDataSetChanged();
交换标签交互后setAdapter(null); setAdapter(adapter);
return POSITION_NONE;
forceLayout()
,invalidate()
, 等等...
现在似乎没有任何效果,但似乎必须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);
}
}