编辑:哇,无法整天解决问题,但提交后不久,并尝试在问题中找到更多代码,我发现了问题并修复了问题它。我会改变这个问题。
FIX :viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
新问题:在ViewPager正常使用标签的情况下,我遇到的问题是显示之前显示的相同内容。选项卡A,B,C中的内容显示在选项卡X,Y,Z中,但我希望它是不同的内容。请注意,所有选项卡都使用相同片段的新实例。
旧问题:
我有一个支持库TabLayout
似乎运行得相当不错。在App加载时,它将加载我想要的选项卡,允许滚动,并更改为正确的片段。
我受到限制,需要修改我当前的实现以切换标签,并根据用户互动将其替换为新标签。当我这样做时,我开始遇到问题。
启动时 设置三个选项卡(A,B,C)以使用相同片段的新实例(仅列表)加载。它们会显示出来,并且所有三个选项卡都可以滚动并显示正确的信息。
在用户交换选项卡上进行交互 - 问题 删除三个选项卡并替换为两个选项卡(X,Y)。它们被设置为上面相同片段的新实例。它们是可滚动的,但这就是问题的起点。
用户点击支持库的SearchView 这可以在我的应用程序中随时发生。它将为已显示的选项卡添加一个附加选项卡。这总是有效,并添加了上述片段的新实例。
正常流量: 1.在SearchView上单击,它将在当前选项卡的末尾添加一个新选项卡(搜索)。所有以前的标签保持不变。 2.在SearchView关闭时,它将删除所有选项卡,然后仅添加以前的选项卡。这可以按预期工作。
如果用户执行了swap-tabs交互,则单击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);
}
}