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(位置);
}
}
好的,新问题。早上我会把老问题删掉。我要睡觉了嘿,克里斯托弗,我希望你做得好。你愿意关注我的问题吗?我也有同样的问题。好的,新问题。早上我会把老问题删掉。我要睡觉了嘿,克里斯托弗,我希望你做得好。你愿意看看我的问题吗?我也有同样的问题。