从ViewPager中删除或清除所有碎片

时间:2016-10-27 19:50:53

标签: android android-fragments android-viewpager android-pageradapter

我正在通过像这样的片段填充视图寻呼机

pagerAdapter = new PagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.container);

        for (int i = 0; i < 10; i++) {
            newfragment fragobj = new newfragment();
            fragobj.setArguments(bundle);
            pagerAdapter.addFragment(fragobj, "Category");
        }

            mViewPager.setAdapter(pagerAdapter);
            mViewPager.setCurrentItem(page);

我希望清除所有碎片并在清除后添加新碎片。如果我现在添加新片段,则会使用旧片段进行广告。

我尝试了很多堆栈溢出答案,但没有一个能为我工作。

4 个答案:

答案 0 :(得分:6)

该片段已被删除并销毁。问题是观点。

只有这对我有用

myViewPager.setSaveFromParentEnabled(false);

干杯!

答案 1 :(得分:2)

在ViewPagerAdapter中添加此方法,并在想要从viewPager中清除片段时调用它

public void clear() {
    FragmentTransaction transaction = manager.beginTransaction();
    for (Fragment fragment : mFragmentList) {
        transaction.remove(fragment);
    }
    mFragmentList.clear();
    transaction.commitAllowingStateLoss();
}

答案 2 :(得分:1)

使用ViewPager2(1.0.0)和FragmentStateAdapter,我还发现在使用notifyDataSetChanged更新数据集后,即使与当前数据相对应的数据也无法重新创建当前视图视图已更改。显然,notifyDataSetChanged不会对更改内容进行非常彻底的调查,并假设当前视图仍然正确。

我发现的解决方法是简单地再次设置与先前数据集相同的适配器:

viewPager2.setAdapter(myFragmentStateAdapter);

显然,设置适配器会使它刷新高速缓存的视图,这当然非常好。幸运的是,它不会检查适配器是否相同。

答案 3 :(得分:0)

mViewPager:是您用来设置片段的视图

mViewPager = (YourViewPager) findViewById(R.id.myPager);

表:只是我所有碎片位置的整数列表

public void destroyAllItem() {
        int mPosition = mViewPager.getCurrentItem();
        int mPositionMax = mViewPager.getCurrentItem()+1;
        if (TABLE.size() > 0 && mPosition < TABLE.size()) {
            if (mPosition > 0) {
                mPosition--;
            }

            for (int i = mPosition; i < mPositionMax; i++) {
                try {
                    Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue());
                    if (objectobject != null)
                        destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject);
                } catch (Exception e) {
                    Log.i(TAG, "no more Fragment in FragmentPagerAdapter");
                }
            }
        }
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);

        if (position <= getCount()) {
            FragmentManager manager = ((Fragment) object).getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove((Fragment) object);
            trans.commit();
        }
    }