Вкладки + ViewPager + FragmentStatePagerAdapter - Как удалить фрагмент?
Я использую проект "Tabs + Swipe", и мне сложно удалить фрагмент.
Шаги, которые я выполняю:
- Удалить вкладку из базы данных
- Удалить вкладку из источника данных FragmentStatePagerAdapter
- Удалить вкладку из actionBar.
- Удалить фрагмент с помощью поддержки FragmentManager.
Проблема:
После выполнения удаления, по какой-то причине, я все еще могу прокрутить вправо и увидеть пустой фрагмент. Я не могу выбрать его, он просто отскакивает назад.
Кажется, что фрагмент не удаляется, а изменяет его положение на тег слева.
Мой адаптер:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new TabFragment();
Bundle args = new Bundle();
args.putInt(TabFragment.ARG_TAB_POSITION, position);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return tabsList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return tabsList.get(position).getTitle();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
FragmentManager manager = ((Fragment)object).getFragmentManager();
android.support.v4.app.FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment)object);
trans.commit();
}
}
Мой метод удаления (вызванный внутри фрагмента):
public void removeTab() {
mTabTableHandler.deleteTab(tab.getId()); //db
tabsList.remove(tabPosition); //data source
actionBar.removeTabAt(tabPosition); // actionbar
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); // support fragmentmanager
tabsList = mTabTableHandler.query(); //requery db
mSectionsPagerAdapter.notifyDataSetChanged(); //notify adapter
}
Цените помощь!
Ответы
Ответ 1
вы можете найти ответ здесь -
Удалить страницу фрагмента из ViewPager в Android
Кажется, что в коде отсутствует код перезаписи следующего метода адаптера:
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
объяснение, почему такое "странное" решение работает, вы можете найти в ответе на вопрос в ссылке, которую я вам предоставил.
Ответ 2
public void removeAllFragments(ViewGroup container) {
/*
* keep this line because section pager adapter has
* the bug to not delete the last fragment completely
* -> so we add an empty fragment
*/
int iStart = 0;
addFragment(new Fragment());
Fragment frag;
int size = fragments.size();
for (int iPos = iStart; iPos < size; iPos++) {
frag = getItem(iStart);
if (frag.isAdded()) {
destroyItem(container, iStart, frag);
}
fragments.remove(frag);
notifyDataSetChanged();
}
}