2016-05-30 6 views
1

У меня есть viewpager в действии. Я загружая его, как этотМой адаптер получает нуль

ArrayList<Fragment> arrayListFragment = new ArrayList<>(); 
Fragment first = Fragment.instantiate(MainActivity.this, MainActivityFragment.class.getName()); 
Fragment second = Fragment.instantiate(MainActivity.this, SecondFragment.class.getName()); 
arrayListFragment.add(first); 
arrayListFragment.add(second); 
Log.d(TAG, "Pager created " + second); 
mPagerAdapter = new SwipeScreenPagerAdapter(getSupportFragmentManager(), 
        arrayListFragment, pageTitles); //This is custom adapter 

И В onCreateView() из SecondFragment Я этот журнал:

mAdapter = new CustomAdapter(mContext, null, mList); 
Log.d(TAG, "Initialised adapter " + this); 

Все отлично работает, когда я запустить приложение. Интересная вещь возникает, когда я помещаю приложение в фоновом режиме, а затем возобновляю его через некоторое время. Действие перезапускается, и viewpager снова инициализируется, и по какой-то причине Log.d(TAG, "Pager created " + second); и Log.d(TAG, "Initialised adapter " + this); операторы печатают фрагмент с различными идентификаторами. Они оба печатают один и тот же идентификатор в первом запуске, но отличаются, когда я возобновляю. И mAdapter становится нулевым при использовании в функции фрагмента (потому что эта функция вызывается на фрагмент, полученный от viewpager).

заявления журнала являются:

Pager created SecondFragment{269ef202} 
Initialised adapter SecondFragment{298444fe #2 id=0x7f0e0084 android:switcher:2131624068:1} 

С, где этот новый фрагмент создается? Сначала я думал, что это какое-то образом восстановить старый фрагмент, но я попытался прохождением нуля в onActivityCreate так:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(null); 
} 

, но он по-прежнему создает отдельный экземпляр фрагмента, а также он имеет иной идентификатор.

+0

Есть ли причина использовать фрагменты над видами? – zgc7009

+0

Да. Это необходимо. На самом деле, у меня есть другие способы добиться того, что я хочу сделать, но я хочу понять, почему это происходит. – crysis

+0

Адаптеры динамические, они визуализируют и перерабатывают по мере необходимости. Когда вы нажимаете на задний план, адаптер начинает сбрасывать содержимое, потому что он видит его ненужным и будет повторно отображать его, когда вы перейдете на передний план. – zgc7009

ответ

0

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

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
} 

так, проходящий нуль в super.onCreate(null) вызвавшем его, чтобы избежать восстановлений последнего фрагмента. В моем случае мне нужно было создать новую копию фрагмента, потому что мои данные должны быть переназначены при каждом создании активности, поэтому set it null with caution.

Смежные вопросы