简体   繁体   English

从ViewPager和TabLayout Android移除标签片段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM