Android: Настройка адаптера списка для фрагмента списка после изменения ориентации приводит к пустому списку

#android #android-fragments #orientation-changes

#Android #android-фрагменты #ориентация-изменения

Вопрос:

Я пытаюсь обработать изменения ориентации в моем приложении для Android. Я столкнулся с проблемой при попытке установить адаптер для моего ListFragment после изменения ориентации. Исключений нет, но список остается пустым; он не заполнен заданными данными.

Я знаю, что при изменении ориентации вся активность воссоздается заново. Я также реализовал способ передачи данных из старой ориентации в новую. Я проверил, что непосредственно перед вызовом ListFragment.setAdapter() массив данных не пуст и содержит точно такие же данные, как и раньше. Я также уверен, что в моем пользовательском классе адаптера нет недостатков, потому что он отлично заполняет список в первый раз.

Кроме того, я ориентируюсь на устройства младше 3.0, поэтому я использую android.support.v4.app.ListFragment для реализации своего ListFragment.

Вот мой метод onCreate ():

 private ListFragment fragmentA;
private ListFragment fragmentB;
@Override
public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.my_activity);

    ActionBar bar = getSupportActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tabA = bar.newTab().setText("TabA");
    ActionBar.Tab tabB = bar.newTab().setText("TabB");

    fragmentA = new MyListFragment();
    fragmentB = new MyListFragment();

    Object retained = getLastCustomNonConfigurationInstance();
    if (retained instanceof MyAsyncTask) {
        ResultWrapper result = ((MyAsyncTask) retained).getResult();
        Log.d("MyActivity", "retained is instance of MyAsyncTask");
        if (result.nowResult == null) {
            Log.d("MyActivity", "null");
        } else {
            Log.d("MyActivity", "nowResult size"   result.nowResult.size());
            fragmentA.setListAdapter(new MyListAdapter(this,
                R.layout.my_list_item, result.nowResult));
        }
        fragmentB.setListAdapter(new MyListAdapter(this,
                R.layout.my_list_item, result.myResult));
    } else {
        fetcher = new MyAsyncTask(this);
        fetcher.execute();
    }

    tabA.setTabListener(new MyTabListener(fragmentA));
    tabB.setTabListener(new MyTabListener(fragmentB));

    bar.addTab(tabA);
    bar.addTab(tabB);

}
  

Любая помощь была бы оценена.

Комментарии:

1. Я не могу сказать по приведенному здесь коду, но я предполагаю, что происходит то, что вы фактически обновляете данные в одном из «исходящих» ListViews вместо новых. Конечно, это просто догадка.

2. Ну, я думаю, что это не так, потому что я воссоздаю оба ListFragments с помощью следующего кода: fragmentA = new MyListFragment(); fragmentB = new MyListFragment();

Ответ №1:

Вероятно, ваш метод getView не вызывается. Чтобы решить эту проблему, вызовите: setListShown (true) в вашем ListFragment. Вы обязаны делать это при использовании библиотеки совместимости.

С уважением, Bram