[英]Remove Tab Fragment from ViewPager and TabLayout Android
I have an activity that hosts tablayout with viewpager and fragments. 我有一个托管带有viewpager和片段的tablayout的活动。 I have successfully setup the tablayout and viewpager with user-populated values from a local database like below code(trying to be brief, showing only one tab here) -
我已经成功地使用来自本地数据库的用户填充的值成功设置了tablayout和viewpager,如下面的代码(尝试简短,此处仅显示一个选项卡)-
public void setUpTabs() {
setUpViewPager(viewPager);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setupWithViewPager(viewPager);
}
private void setUpViewPager(ViewPager viewPager) {
Customize customize = new Select()
.from(Customize.class)
.where("tabName = ? ", Constants.NATURE)
.executeSingle();
if (customize != null) {
String nature = customize.tabName;
Log.d(TAG, "Nature Tab Name:\t" + nature);
}
pagerAdapter = new TabsPagerAdapter(getSupportFragmentManager());
pagerAdapter.addTab(new Top30Fragment(), Constants.Top30); // default tab
if (nature != null) {
pagerAdapter.addTab(new NatureFragment(), Constants.NATURE); // dynamic tab from db
}
pagerAdapter.addTabAtLastPosition(new PrefsFragment(), Constants.PREFS);
viewPager.setAdapter(pagerAdapter);
}
Customize is model class, I have used ActiveAndroid library for persistence. 自定义是模型类,我已经使用ActiveAndroid库进行持久化。 Here's my tabsadapter class code:
这是我的tabsadapter类代码:
public class TabsPagerAdapter extends FragmentPagerAdapter {
private static final String TAG = TabsPagerAdapter.class.getSimpleName();
private List<Fragment> fragmentList = new ArrayList<>();
private List<String> titlesList = new ArrayList<>();
private ViewPager viewPager;
private TabLayout tabLayout;
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
public void addTab(Fragment fragment, String name){
fragmentList.add(fragment);
titlesList.add(name);
}
public void addTabAtLastPosition(Fragment fragment, String name){
fragmentList.add(fragmentList.size(), fragment);
titlesList.add(name);
}
public void removeTab(Fragment fragment, String name){ //Not working
for (int i = 0; i < fragmentList.size(); i++){
if (fragmentList.get(i).equals(fragment)){ // never enters/returns from this loop
Log.d(TAG, "Fragment at position:\t" + i);
fragmentList.remove(fragment);
titlesList.remove(name);
}
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titlesList.get(position);
}
}
In my preferences fragment(also part of the tablayout), I have a recyclerview with checkboxes, case1:if checked, the tab is checked in db and only added to tablayout if not already there. 在我的首选项片段(也是tablayout的一部分)中,我有一个带复选框的recyclerview,case1:如果选中,则在db中选中该选项卡,并且仅在不存在时才添加到tablayout中。 case2:Otherwise if unchecked, means the tab is in layout and db and has to be removed from both.
case2:否则,如果未选中,则表示该选项卡位于布局和db中,必须将两者都删除。
I have started working on case 2 but I'm only able to delete values from db, the tab to be deleted is still present in tablayout. 我已经开始处理案例2,但是我只能从db中删除值,要删除的标签仍在tablayout中。 Here's my recyclerview adapter code to delete the tab:
这是我的recyclerview适配器代码,用于删除标签:
public class PrefsAdapter extends RecyclerView.Adapter<PrefsCustomizeViewHolder> {
private static final String TAG = PrefsAdapter.class.getSimpleName();
private final Context context;
private List<Customize> itemsList;
private long id_nature, id_space, id_seasons, id_art, id_scifi, id_misc;
private Customize cust; // Model class for saving and retrieving tabs
private TabsPagerAdapter pagerAdapter;
private String nature, space, seasons, art, scifi, misc;
private String tabNature, tabSpace, tabSeasons, tabArt, tabScifi, tabMisc;
public PrefsAdapter(Context context, List<Customize> itemsList) {
this.context = context;
this.itemsList = itemsList;
pagerAdapter = new TabsPagerAdapter(((AppCompatActivity)context).getSupportFragmentManager());
}
@Override
public PrefsCustomizeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.prefs_customize_items_layout, parent, false);
return new PrefsCustomizeViewHolder(view);
}
@Override
public void onBindViewHolder(final PrefsCustomizeViewHolder viewholder, final int position) {
final Customize customize = itemsList.get(position);
Picasso.with(context)
.load(customize.getIcon())
.fit()
.into(viewholder.prefsSelImg);
// search db to find if checkbox is checked, i.e tab is present or not and update recyclerview
switch (position) {
case 0:
cust = new Select()
.from(Customize.class)
.where("tabName = ? ", Constants.SPACE)
.executeSingle();
if (cust != null) {
space = cust.tabName;
Log.d(TAG, "Space Tab From DB:\t" + space);
id_space = cust.getId();
Log.d(TAG, "Space Tab Id from DB:\t" + id_space);
viewholder.prefsCheckBox.setChecked(true);
} else {
viewholder.prefsCheckBox.setVisibility(View.INVISIBLE);
viewholder.prefsCheckBox.setChecked(false);
}
break;
}
viewholder.prefsSelImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (position) {
case 0:
if (viewholder.prefsCheckBox.isChecked()){
viewholder.prefsCheckBox.setChecked(false);
Customize.delete(Customize.class, id_space);
Log.d(TAG, "Deleted Space id:\t" + id_space); // prints right log detail
pagerAdapter.removeTab(new SpaceFragment(), Constants.SPACE);
} else {
viewholder.prefsCheckBox.setChecked(true);
customize.setTabId(UUID.randomUUID().toString());
customize.setTabName(Constants.NATURE);
customize.save();
pagerAdapter.addTab(new SpaceFragment(), Constants.SPACE);
viewholder.prefsCheckBox.setVisibility(View.VISIBLE);
}
break;
}
}
});
}
@Override
public int getItemCount() {
if (itemsList == null) {
return 0;
}
return itemsList.size();
}
}
The tabspagerAdapter.removeTab() never gets called even though I have initialized it in the constructor like below: 即使我在如下构造函数中初始化了tabspagerAdapter.removeTab(),也永远不会调用它:
public PrefsAdapter(Context context, List<Customize> itemsList) {
this.context = context;
this.itemsList = itemsList;
pagerAdapter = new TabsPagerAdapter(((AppCompatActivity)context).getSupportFragmentManager());
}
Can someone help me out with removing the fragment and also why the pagerAdapter.removeTab(fragment, title)
method never gets called and how to update the tab layout. 有人可以帮助我删除片段,以及为什么
pagerAdapter.removeTab(fragment, title)
方法永远不会被调用以及如何更新选项卡布局的原因。 Thanks. 谢谢。
I have used the following code to successfully change the number of tabs (both add and remove). 我使用以下代码成功更改了选项卡的数量(添加和删除)。 I found I had to remove them from both the pager adapter and the tab layout.
我发现必须将它们从寻呼机适配器和选项卡布局中删除。
int cnp = mPagerAdapter.getCount();
// remove all tabs (or just the ones you need to remove)
// from both the pager adapter and the tab layout
for(int i = cnp-1; i >= 0; --i) {
mPagerAdapter.destroyItem(mViewPager, i, mPagerAdapter.getItem(i));
mTabLayout.removeTabAt(i);
}
// add back in whatever tabs you need and update the pager adapter to be consistent
mTabLayout.addTab(mTabLayout.newTab().setText("Tab 0"),0);
mTabLayout.addTab(mTabLayout.newTab().setText("Tab 1"),1);
mPagerAdapter.setConfiguration(2); // my custom method to tell it which pages to show
mTabLayout.invalidate();
mPagerAdapter.notifyDataSetChanged();
Relevant class members: 相关班级成员:
ViewPager mViewPager;
TabLayout mTabLayout;
MyPagerAdapter mPagerAdapter; // extends FragmentPagerAdapter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.