Android: FragmentPagerAdapter не сохраняет состояние фрагмента?

У меня проблема с FragmentPagerAdapter.

Я не могу сохранить состояние фрагмента, а затем возникает мнение, что внутри фрагмента . Всякий раз, когда я использую пролистывание влево и вправо, фрагмент воссоздается путем переопределения метода getItem(int position) в статическом классе, который расширяет FragmentPagerAdapter.

 public static class GraphicsCollectionPagerAdapter extends FragmentPagerAdapter {

    final int NUM_ITEMS = 3; // number of tabs

    public GraphicsCollectionPagerAdapter(FragmentManager fm) {

        super(fm);
        fragmentList = new AnalyzeFragmentPageListWithDate();
        fragment1 = new  AnalyzeFragmentPage1();
        fragment2 = new  AnalyzeFragmentPage2();
    }

    @Override
    public Fragment getItem(int position) {
        //Log.i(TAG, "getItem() -> New fragment at position " + position);


        switch (position) {

        case 0:         
            return fragmentList;
       case 1:
            return fragment1;
       case 2:
             return fragment2;
        }
        return null;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {

         case 0:
            return "Fragm1";
        case 1:
            return "Fragm2";
        case 2:
            return "Fragm3";

    }
        return "OBJECT " + (position + 1);
    }


}

В методе OnCreateView каждого экземпляра фрагмента есть несколько шагов к базе данных SQLite, и это вызывает насыщение пула соединений с базой данных.

Предупреждение, обнаруживаемое при каждом динамическом изменении фрагмента: «W/SQLiteConnectionPool (1111): объект SQLiteConnection для базы данных «/data/data/com.myapp/databases/mydb» просочился! Пожалуйста, исправьте свое приложение, чтобы правильно завершать выполняемые транзакции и закрыть базу данных, когда она больше не нужна».

Я уже безуспешно пытался использовать FragmentStatePagerAdapter.

Не могли бы вы сказать мне, как действовать дальше? Я не хочу, чтобы фрагмент каждый раз регенерировался, вызывая проблемы с базой данных. У вас есть пример сохранения фрагмента/просмотра?

Я не нашел ни одного предложения на данный момент. большое спасибо


person GlassExplorer89    schedule 28.03.2014    source источник
comment
У вас есть списки в ваших фрагментах?   -  person playmaker420    schedule 28.03.2014
comment
У меня есть списки и гистограммы. Спасибо   -  person GlassExplorer89    schedule 28.03.2014
comment
У меня были похожие проблемы, когда список в первом фрагменте перезагружался после прихода из третьего фрагмента. Что я сделал, так это заменил Fragment на listFragment и использовал SimpleCursorAdapter и LoaderManager.LoaderCallbacks‹Cursor› для заполнения списка   -  person playmaker420    schedule 28.03.2014
comment
Можете ли вы привести пример этого исправления? Спасибо   -  person GlassExplorer89    schedule 28.03.2014
comment
Как вы вызываете GraphicsCollectionPagerAdapter?   -  person playmaker420    schedule 28.03.2014


Ответы (2)


используйте свойство setOffscreenPageLimit для вашего объекта ViewPager.

ViewPager pager = (ViewPager) findViewById(R.id.viewPagerId);
pager.setOffscreenPageLimit(2);
person Ayaz Alifov    schedule 27.08.2014

Прежде всего, создайте новый экземпляр Fragment каждый раз, когда вызывается getItem().

@Override
public Fragment getItem(int position) {
    switch (position) {
    case 0:         
        return new FragmentList();
    case 1:
        return new  AnalyzeFragmentPage1();
    case 2:
         return new  AnalyzeFragmentPage2();
    }
    return null;
}

Обратите внимание, что FragmentPagerAdapter работает не так, как обычный Adapter, то есть НЕ использует пустой сосуд Fragment, а затем заполняет его другими данными.

Вместо этого он создает новый Fragment всякий раз, когда это необходимо. Таким образом, вы должны передавать данные (если они есть) при создании Fragment. Пожалуйста, изучите пример в документации Android.

В проектах реального времени вместо передачи текущей позиции новому Fragment вы можете передать фактическую ID записи, на которую должен ссылаться Fragment.

person aldorain    schedule 28.03.2014