添加一个 'ALL ITEMS' 选项卡以及其他动态创建的选项卡 Android
Add an 'ALL ITEMS' tab along with other dynamically created tabs Android
我是 android 的新手,我制作了一个视图,其中我根据名称数组填充了多个选项卡。
我已成功完成,但我想在我的选项卡开头添加一个额外的选项卡,其标题将是所有项目。
这是我用来创建动态标签的内容:
private void tabsInit() {
for (int l = 0; l < internalCat.size(); l++) {
product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l)));
}
ProductPagerAdapter adapter = new ProductPagerAdapter(getSupportFragmentManager(), product_tabs_layout.getTabCount(), internalCat);
product_viewpager.setAdapter(adapter);
product_viewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(product_tabs_layout));
product_tabs_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
product_viewpager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
product_viewpager.setCurrentItem(tab.getPosition());
}
});
}
适配器:
public class ProductPagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
List<String> lstInternalCats;
public ProductPagerAdapter(@NonNull FragmentManager fm, int mNumOfTabs, List<String> lstInternalCats) {
super(fm);
this.mNumOfTabs = mNumOfTabs;
this.lstInternalCats = lstInternalCats;
}
@NonNull
@Override
public Fragment getItem(int position) {
return new ProductsFragment().newInstance(lstInternalCats.get(position));
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
这是输出:
我想要的是像这样的附加标签:
我试图在循环外添加选项卡,然后将 tabscount+1 传递给选项卡的数量,但它给了我错误。
java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
有什么办法吗。请帮忙。
您只是没有我假设的元素“All”数组。所以,即使你写 internalCat.size() + 1
它也不会在那里。您应该像这样手动添加它:
product_tabs_layout.addTab(product_tabs_layout.newTab().setText("All"));
for (int l = 0; l < internalCat.size(); l++) {
product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l)));
}
在这种情况下,您将添加选项卡“全部”,然后添加数组中的所有其他项目,并且永远不会得到 IndexOutOfBoundException
用这部分代码更新 for 循环
for (int l = 0; l < internalCat.size()-1; l++) { product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l))); }
以上解决方案对我不起作用。
我通过手动添加“ALL”作为列表中的第一个元素解决了这个问题,然后添加了从 Index = 1 开始的剩余项目;
这样我就得到了第一个元素作为 ALL 选项卡,其余的都是我想要的。
代码:
AtomicInteger index = new AtomicInteger(1);
internalCat.add(0, "All");
for (int i = 0; i < array.length(); i++) {
internalCat.add(index.get(), array.getString(i));
index.getAndIncrement();
}
我是 android 的新手,我制作了一个视图,其中我根据名称数组填充了多个选项卡。
我已成功完成,但我想在我的选项卡开头添加一个额外的选项卡,其标题将是所有项目。
这是我用来创建动态标签的内容:
private void tabsInit() {
for (int l = 0; l < internalCat.size(); l++) {
product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l)));
}
ProductPagerAdapter adapter = new ProductPagerAdapter(getSupportFragmentManager(), product_tabs_layout.getTabCount(), internalCat);
product_viewpager.setAdapter(adapter);
product_viewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(product_tabs_layout));
product_tabs_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
product_viewpager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
product_viewpager.setCurrentItem(tab.getPosition());
}
});
}
适配器:
public class ProductPagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
List<String> lstInternalCats;
public ProductPagerAdapter(@NonNull FragmentManager fm, int mNumOfTabs, List<String> lstInternalCats) {
super(fm);
this.mNumOfTabs = mNumOfTabs;
this.lstInternalCats = lstInternalCats;
}
@NonNull
@Override
public Fragment getItem(int position) {
return new ProductsFragment().newInstance(lstInternalCats.get(position));
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
这是输出:
我想要的是像这样的附加标签:
我试图在循环外添加选项卡,然后将 tabscount+1 传递给选项卡的数量,但它给了我错误。
java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
有什么办法吗。请帮忙。
您只是没有我假设的元素“All”数组。所以,即使你写 internalCat.size() + 1
它也不会在那里。您应该像这样手动添加它:
product_tabs_layout.addTab(product_tabs_layout.newTab().setText("All"));
for (int l = 0; l < internalCat.size(); l++) {
product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l)));
}
在这种情况下,您将添加选项卡“全部”,然后添加数组中的所有其他项目,并且永远不会得到 IndexOutOfBoundException
用这部分代码更新 for 循环
for (int l = 0; l < internalCat.size()-1; l++) { product_tabs_layout.addTab(product_tabs_layout.newTab().setText(internalCat.get(l))); }
以上解决方案对我不起作用。
我通过手动添加“ALL”作为列表中的第一个元素解决了这个问题,然后添加了从 Index = 1 开始的剩余项目;
这样我就得到了第一个元素作为 ALL 选项卡,其余的都是我想要的。
代码:
AtomicInteger index = new AtomicInteger(1);
internalCat.add(0, "All");
for (int i = 0; i < array.length(); i++) {
internalCat.add(index.get(), array.getString(i));
index.getAndIncrement();
}