[英]Android TabLayout ViewPager not inflating tab fragment on backstack
[英]Remove Tab Fragment from ViewPager and TabLayout Android
我有一個托管帶有viewpager和片段的tablayout的活動。 我已經成功地使用來自本地數據庫的用戶填充的值成功設置了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);
}
自定義是模型類,我已經使用ActiveAndroid庫進行持久化。 這是我的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);
}
}
在我的首選項片段(也是tablayout的一部分)中,我有一個帶復選框的recyclerview,case1:如果選中,則在db中選中該選項卡,並且僅在不存在時才添加到tablayout中。 case2:否則,如果未選中,則表示該選項卡位於布局和db中,必須將兩者都刪除。
我已經開始處理案例2,但是我只能從db中刪除值,要刪除的標簽仍在tablayout中。 這是我的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();
}
}
即使我在如下構造函數中初始化了tabspagerAdapter.removeTab(),也永遠不會調用它:
public PrefsAdapter(Context context, List<Customize> itemsList) {
this.context = context;
this.itemsList = itemsList;
pagerAdapter = new TabsPagerAdapter(((AppCompatActivity)context).getSupportFragmentManager());
}
有人可以幫助我刪除片段,以及為什么pagerAdapter.removeTab(fragment, title)
方法永遠不會被調用以及如何更新選項卡布局的原因。 謝謝。
我使用以下代碼成功更改了選項卡的數量(添加和刪除)。 我發現必須將它們從尋呼機適配器和選項卡布局中刪除。
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();
相關班級成員:
ViewPager mViewPager;
TabLayout mTabLayout;
MyPagerAdapter mPagerAdapter; // extends FragmentPagerAdapter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.