简体   繁体   English

从FragmentStatePagerAdapter填充的ViewPager中删除所有片段

[英]Remove all fragments from ViewPager populated by FragmentStatePagerAdapter

I have a ViewPager that I am populating with fragments(representing objects from arrayListOfObjects) using FragmentStatePagerAdapter. 我有一个ViewPager,我正在使用FragmentStatePagerAdapter填充片段(表示arrayListOfObjects中的对象)。 All works well: 一切正常:

            mMyFragmentPagerAdapter = new fragmentAdapter(getSupportFragmentManager(),orientation
            ,rePopulatedfireInfoList);
        mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container);
        initButton();
        setTab();
        mPager.setAdapter(mMyFragmentPagerAdapter); 

The fragment adapter extends FragmentStatePagerAdapter. 片段适配器扩展了FragmentStatePagerAdapter。

From the primary activity I launch a dialog themed activity; 从主要活动中,我启动了一个对话主题活动; where the user may add a new favourite location creating a new object which alters the arraylist of objects passed by the primary activity. 用户可以在其中添加一个新的收藏夹位置,以创建一个新对象,该对象将更改主要活动传递的对象的数组列表。 This is the code for starting dialog activity; 这是启动对话框活动的代码; all works fine: 一切正常:

        Intent locationIntent = new Intent(afisController.this, locationActivity.class);
    locationIntent.putExtra("firesList", new fireInfoListWrapper(arrayListOfObjects));
    startActivityForResult(locationIntent,1);

The floating activity adds objects into arrayListOfObjects. 浮动活动将对象添加到arrayListOfObjects中。

On the primary activity's onActivityResult I compare the arraListOfObjects I'm receiving with the one I sent; 在主要活动的onActivityResult上,我将接收到的arraListOfObjects与发送的arraListOfObjects进行比较。 if different I want to completely remove the contents of the viewPager and recreate it with the new arrayListOfObjects. 如果不同,我想完全删除viewPager的内容,并使用新的arrayListOfObjects重新创建它。 This is the onActivityResults: 这是onActivityResults:

     protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
 Toast.makeText(this, "Activity Results fired..." , 1500 ).show();
            if ((resultCode == 0) && (data != null)) { 
                Log.i("onActvityResult", "Inside resultCode check");   
                Bundle b = data.getExtras();
                if(b != null){
                    Log.i("onActvityResult", "not null");
                    returnedFireInfoList = (ArrayList<fireInfo>) data.getSerializableExtra("firesListResult"); 
                    Log.i("onActvityResult", "results Size: "+returnedFireInfoList.size());
                    if(returnedFireInfoList.size()>0){
                        Log.i("onActvityResult", "locationName: "+returnedFireInfoList.get(0).getLocationName());
                        //compare returnedFireInfoList and rePopulatedfireInfoList, if different; 
                        //add difference to rePopulatedfireInfoList and write back to file.
                        updateFireInfos(returnedFireInfoList, rePopulatedfireInfoList);
        if(returnedFireInfoList.size()!=rePopulatedfireInfoList.size()){
mMyFragmentPagerAdapter1 = new fragmentAdapter(getSupportFragmentManager(),orientation
                    ,returnedFireInfoList);
            mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container); 
            Log.i("updateFireInfos", "fragmentsCount is"+mPager.getCurrentItem());
            fireInfoFragment fragment = 
                      (fireInfoFragment) getSupportFragmentManager().findFragmentById(R.id.fireInfoFragment_container);
//This is where the problem is, I don't want to remember what was already on the viewPager //called mPager before.
           //   mPager.removeAllViews();
            //mPager.setAdapter(null);
            mMyFragmentPagerAdapter1.notifyDataSetChanged();            
            mPager.setAdapter(mMyFragmentPagerAdapter1);               mMyFragmentPagerAdapter1.notifyDataSetChanged();                     
                    }                   
                }
            }        

This is the fragmentStateAdapter code: 这是fragmentStateAdapter代码:

public class fragmentAdapter extends FragmentStatePagerAdapter {

private FragmentManager fragmentManager;
 private FragmentTransaction mCurTransaction = null;
 private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
 private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
 private Fragment mCurrentPrimaryItem = null;



public void restoreState(Parcelable state, ClassLoader loader) {
    //Need to only delete info from marked fragments (theoned that are stored on orientationchange
    //Currently redoing the entire call; resulting in delay due to server call
    //if(isLastOrientationPortrait != isPortrait){
    if(state != null){
        Bundle bundle1 = (Bundle) state;
        bundle1.setClassLoader(loader);
        Iterable<String> keys = bundle1.keySet();
        Log.i("restoreState", "containsKey FragmentStatePagerAdapter: "+keys);
        //android.support.v4.app.FragmentManager fragmentManager= fragmentAdapter.this.fragmentManager;
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        //if (fragmentTransaction == null) {
        //  Log.i("restoreState", "fragmentTransactionTest");

            fragmentTransaction = fragmentManager.beginTransaction();
       // }
        for (String key : keys) {
            if (key.startsWith("f")) {
                Fragment f = fragmentManager.getFragment(bundle1,
                        key);
                fragmentTransaction.remove(f);
                fragmentTransaction.commit();
            }
            }
        }
    //}       
    }


@Override
public int getItemPosition(Object object) {
    // TODO Auto-generated method stub
    //return super.getItemPosition(object);
    return fragmentAdapter.POSITION_NONE;
}


public fragmentAdapter(android.support.v4.app.FragmentManager fragmentManager,String orientation,
         ArrayList<fireInfo> fireInfoList) {
     super(fragmentManager);
     this.orientation = orientation;
     this.fireInfoList = fireInfoList;
     this.numItems = fireInfoList.size();
     this.fragmentManager=fragmentManager;
 }
 ArrayList<fireInfo> fireInfoList;
 String orientation;
 int numItems;


@Override
 public int getCount() {
     Log.i("numItems", "is: "+fireInfoList.size());
     return numItems;
 }

@Override
public Fragment getItem(int arg0) {
    Log.i("fragmentAdapterIndex", "is: "+arg0);
    return fireInfoFragment.newInstance(orientation, fireInfoList.get(arg0));
}    

} }

Problem: But the new ArrayListOfObjects is added alongside the old one before I fired the startActivityFor results. 问题:但是,在我启动startActivityFor结果之前,新的ArrayListOfObjects与旧的ArrayListOfObjects一起添加了。

How do I force the viewPager to forget it old content? 如何强制viewPager忘记旧内容? basically reset the viewPager adapter with this newArrayListofObjects using my fragmentStateAdapter? 基本上使用我的fragmentStateAdapter将此newArrayListofObjects重置viewPager适配器?

I guess the problem is in the fact that old fragments still reside in FragmentManager you use for your adapter. 我猜问题在于事实上旧片段仍然驻留在用于适配器的FragmentManager If this is the case all you have to do is remove all old fragments from the fragment manager. 如果是这种情况,您要做的就是从片段管理器中删除所有旧片段。

So basically just execute the following code in the constructor of your adapter: 因此,基本上只需在适配器的构造函数中执行以下代码:

public fragmentAdapter(FragmentManager fragmentManager, String orientation, ArrayList<fireInfo> list) {
    super(fragmentManager);
    if (fragmentManager.getFragments() != null) {
        fragmentManager.getFragments().clear();
    }
    //... your other code here
}

This line of code is unnecessary: 这行代码是不必要的:

mMyFragmentPagerAdapter1.notifyDataSetChanged();     

EDIT: It may be more correct to remove your fragments using FragmentTransaction : 编辑:使用FragmentTransaction删除片段可能更正确:

    List<Fragment> fragments = fragmentManager.getFragments();
    if (fragments != null) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        for (Fragment f : fragments) {
            //You can perform additional check to remove some (not all) fragments:
            if (f instanceof AddedByCurrentPagerAdapterFragment) { 
                ft.remove(f);
            }
        }
        ft.commitAllowingStateLoss();
    }

This will take some time for FragmentTransaction to be (asynchronously) performed. (异步)执行FragmentTransaction需要花费一些时间。

All I needed to do was to re-assign the FragmentStatePagerAdapter. 我要做的就是重新分配FragmentStatePagerAdapter。

This has been in place as can be seen in onActivityResult but what was masking the correct behaviour was my viewPager page indicator it was incrementing the pages eg if I had 2 pages on the viewPager and call the child actvity which will add one object on the arrayListOfObjects; 可以在onActivityResult中看到这一点,但是掩盖正确行为的是我的viewPager页面指示器,它正在增加页面,例如,如果我在viewPager上有2个页面并调用子活动,它将在arrayListOfObjects上添加一个对象; the viewPager page indicator would show that I now have 2 plus three pages (5). viewPager页面指示器将显示我现在有2加3页(5)。

I had to reset the viewPage indicator in onActivityResult to have it determined by this new arrayListOfObjects just returned by the floating activity. 我必须在onActivityResult中重置viewPage指示器,以使其由浮动活动刚刚返回的这个新arrayListOfObjects确定。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从 ViewPager 中删除或清除所有片段 - Remove or Clear All Fragments From ViewPager 使用FragmentStatePagerAdapter从ViewPager动态删除项目 - Dynamically remove an item from a ViewPager with FragmentStatePagerAdapter 使用fragmentStatePagerAdapter更新viewpager中的片段/视图 - Updating fragments/views in viewpager with fragmentStatePagerAdapter 片段从FragmentStatePagerAdapter中消失 - Fragments disapear from FragmentStatePagerAdapter 从FragmentStatePagerAdapter中删除片段 - Removing fragments from FragmentStatePagerAdapter FragmentStatePagerAdapter和ViewPager:片段无序实例化 - FragmentStatePagerAdapter and ViewPager: Fragments instantiate out of order FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段) - FragmentStatePagerAdapter memory leak (nested fragments with viewpager) 防止在下一或上一个Viewpager滑动时FragmentStatePagerAdapter创建新的片段 - Prevent FragmentStatePagerAdapter from creating new fragments when viewpager is swiped next or previous Tabs + ViewPager + FragmentStatePagerAdapter - 如何删除片段? - Tabs + ViewPager + FragmentStatePagerAdapter - How to remove fragment? 使用ViewPager FragmentStatePagerAdapter时在片段中提供唯一标识符 - Giving unique identifiers in fragments while using ViewPager FragmentStatePagerAdapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM