ViewPager не отображает предыдущие фрагменты при пролистывании

Я разрабатываю приложение, состоящее из пейджера просмотра, пока я пролистываю пейджер просмотра, все фрагменты загружаются правильно, но вот моя проблема. Когда я снова прокручиваю пейджер просмотра с теми же фрагментами, он снова загружается, но в соответствии с моим требованием предыдущие загруженные фрагменты должны быть восстановлены. Я пробовал использовать следующий код двумя способами.

А) Вот мой просмотр пейджера

mViewPager = (ViewPager)mMyPageFragment.findViewById(R.id.Viewpager);

        myAdapter = new MyAdapter(getFragmentManager());
        mViewPager.setAdapter(myAdapter);
        myAdapter.notifyDataSetChanged();

В адаптере

public class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public Fragment getItem(int position) {
        System.out.println("MyAdapter="+position);
        switch (position) {
        case 0:
            return new MyPageFirstFragment1();
        case 1:
            return new MyPageFirstFragment2();
        case 2:
            return new MyPageFirstFragment3();

        default:
            return null;
        }
    }
}

Второй способ

private static Hashtable<Integer, Fragment> fragmentItems = new Hashtable<Integer, Fragment>();

    @Override
    public Fragment getItem(int position) {
        System.out.println("MyAdapter=" + position);
        switch (position) {
        case 0: {
            if (!fragmentItems.containsKey(position)) {
                fragmentItems.put(position, new MyPageFirstFragment1());
            }
            return fragmentItems.get(position);
        }
        case 1: {
            if (!fragmentItems.containsKey(position)) {
                fragmentItems.put(position, new MyPageFirstFragment2());
            }
            return fragmentItems.get(position);
        }
        case 2: {
            if (!fragmentItems.containsKey(position)) {
                fragmentItems.put(position, new MyPageFirstFragment3());
            }
            return fragmentItems.get(position);
        }
        case 3: {
            if (!fragmentItems.containsKey(position)) {
                fragmentItems.put(position, new MyPageFirstFragment4());
            }
            return fragmentItems.get(position);
        }

        default:
            return null;
        }
    }

Это код, который я использовал, но я не могу сохранить фрагменты.


person NikhilReddy    schedule 18.02.2013    source источник


Ответы (1)


вы не должны сохранять свои фрагменты в статический объект... потому что диспетчер фрагментов сохраняет информацию о ваших фрагментах во время изменений конфигурации устройства и восстанавливает ваши фрагменты после этого... но в новые объекты фрагментов. И ваши «старые» статические объекты становятся недействительными. Я предпочитаю проверять активность фрагмента методом onCreate(), если saveInstanceState != null, и если это так, я восстанавливаю фрагменты пейджера просмотра по этим тегам (findFragmentByTag) и создаю новый адаптер из восстановленных фрагментов.. например, `

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i( LOG_TAG, "onCreate()" );
        //setting view pager
        mViewPager = (ViewPager) findViewById( R.id.mainActivity_viewPager );


        //initializing activity
        if( savedInstanceState == null ) {
            Log.i( LOG_TAG, "onCreate() - savedInstanceState == null" );
            //activity first creation
        } else {
            Log.i( LOG_TAG, "onCreate(), savedInstanceState != null, it is activity start after device reconfiguration.. " );


            //recreating viewpager adapter
            mViewPager.setAdapter( recreateParentFragmentListAdapter() );

        }

и
`

private ParentFragmentListAdapter recreateParentFragmentListAdapter() {
        List<BaseParentFragment> fragments = new ArrayList<BaseParentFragment>(3);
        for( int id = 0; id < 3; id++ ) {
            String fragmentTag = getFragmentTag( R.id.mainActivity_viewPager, id );//int -> long converting
            BaseParentFragment fragment = (BaseParentFragment) (getSupportFragmentManager().findFragmentByTag( fragmentTag ));

            Log.i( LOG_TAG, "onCreate() - finding fragment with tag {" + fragmentTag + "}, found fragment = " + (fragment == null ? "null" : fragment.toString() ) );

            if( fragment == null ){//creating it
                switch( id ) {
                case 0:
                    fragment = new Tab1Fragment();
                case 1:
                    fragment = new Tab2Fragment();
                case 2:
                    fragment = new Tab3Fragment();
                }
            } 
            fragments.add( fragment );
        }

        ParentFragmentListAdapter adapter = new ParentFragmentListAdapter( getSupportFragmentManager(), fragments );
        return adapter;
    }

` и

private String getFragmentTag( int viewId, long id ) {
        return "android:switcher:" + viewId + ":" + id;
    }

из SDK

person rdbmsa    schedule 18.02.2013