[英]Tabs + ViewPager + FragmentStatePagerAdapter - How to remove fragment?
I'm using the "Tabs + Swipe" project and I'm having a difficult time removing a fragment. 我正在使用“Tabs + Swipe”项目,我很难删除片段。
Steps I'm doing: 我正在做的步骤:
The problem: After I perform the remove, for some reason, I can still scroll to the right and see an empty fragment. 问题:执行删除后,由于某种原因,我仍然可以向右滚动并看到一个空片段。 I can't select it, it just bounces back.
我不能选择它,它只是反弹回来。 It seems like the fragment is not being removed but rather changes its position to the tag from the left.
看起来片段没有被移除,而是从左侧将其位置改变为标签。
My Adapter: 我的适配器:
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();
}
}
My remove method (called from within the fragment): 我的删除方法(从片段内调用):
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
}
Appreciate the help! 感谢帮助!
you can find the answer here - Remove Fragment Page from ViewPager in Android 你可以在这里找到答案 - 从Android中的ViewPager中删除片段页面
it seems what missing in your code is overwriting of the following adapter's method: 似乎代码中缺少的是覆盖以下适配器的方法:
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
explanation why such "weird" solution works you can find in the answer to the question in the link I provided you. 解释为什么这种“怪异”的解决方案有效,你可以在我提供给你的链接中找到问题的答案。
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.