FragmentPagerAdapter ListFragments: как загрузить выбор ListView?

У меня проблема с персональным приложением для Android, которое сводит меня с ума.

У меня есть действие с PagerSlidingTabStrip, которое состоит из FragmentPagerAdapter с 4 фиксированными вкладками, как на рисунке ниже.

Первая вкладка является своего рода сводкой, в которой представлены элементы выбора, выполненные на следующих вкладках (2, 3 и 4 на изображении). Каждый из ListFragment создается в методе getItem в FragmentAdapter, и я запускаю этот код при загрузке каждого ListFragment:

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

    // Set adapter and options
    setListAdapter(mAdapter);
    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

    // Code omitted
    // currentSelection is a field set by a method on the ListFragment

    // Load selection
    setSelectedItem(currentSelection);
}

public void setSelectedItem(int val) {  
    // Check if the ListView exists
    if (getActivity() != null) {
        // Set selection
        try {
            getListView().setItemChecked(val - 1, true);
        } catch (Exception e) {
            Log.e("myapp", "Exception while setting selection!");
        }
    }
}

Таким образом, в основном я вызываю метод в ListFragment, который устанавливает целочисленную переменную currentSelection в число, и когда я пролистываю вкладки, ListFragments показывает правильные выбранные элементы. Это работает отлично.

Проблема возникает, когда я пытаюсь обновить списки в коде (т. Е. Обновить адаптеры ListFragment новыми строками): я хочу обновить также currentSelection, основываясь на значениях, сохраненных в моей базе данных.

Вот что происходит:

  1. Я загружаю выделение "2-3-5" из базы данных и присваиваю этим значениям поле currentSelection трех вкладок ListFragment.
  2. Если я проведу пальцем по вкладке 2 и выберу номер позиции "2" (см. Изображение, правильно!)
  3. На вкладке 3 выбран номер позиции "3" (правильно!)
  4. На вкладке 4 выбран номер "5" (правильно!)
  5. Я загружаю новый набор предметов и выбор "1-2-3" из базы данных; затем я снова назначаю поле currentSelection трех вкладок ListFragment.
  6. На вкладке 4 выбор обновляется, и теперь он равен "3" (правильно!)
  7. Я проведу пальцем по вкладке 3, и номер элемента "2" будет выбран (правильно!)
  8. Я проведу пальцем до вкладки 2, и будет выбран номер элемента "2" (НЕПРАВИЛЬНО, поскольку это старое значение!)

Таким образом, на вкладке № 2 (то есть 2 вкладки далеко от 4) выбор не обновляется. Кроме того, когда я нахожусь на вкладке 4 и обновляю данные, метод setSelectedItem на вкладке 2 переходит в исключение, которое перехватывается ("Контент еще не создан"). Действие существует, но ListView, по-видимому, не может принять выбор с помощью setItemChecked.

РЕДАКТИРОВАТЬ: Когда я перехожу с вкладки 4 на 3 (шаг 7) вызывается onViewCreated из вкладки 2, и если я вызываю там setSelectedItem, он НЕ вызывает исключений, но выбор также не устанавливается.

Как выбрать нужный элемент на всех трех вкладках, если getListView() не работает?

1 ответ

Решение

Кроме того, когда я нахожусь на вкладке 4 и обновляю данные, метод setSelectedItem на вкладке 2 переходит в исключение, которое перехватывается ("Контент еще не создан").

Это происходит потому, что вы слишком далеко от видимой страницы, что означает, что вид фрагмента разрушается (в целях эффективности).

Как выбрать нужный элемент на всех трех вкладках, если getListView() не работает?

Переместите метод setSelectedItem() в обратный вызов onResume() ListFragment. Прямо сейчас вы делаете правильные настройки для восстановления выбранного элемента, но, поскольку представление фрагмента уничтожается и автоматически восстанавливается (с использованием предыдущего выбора), вы получите старое значение, так как восстановление системы происходит после вашего вызова. в onActivityCreated(). onResume() - это последний обратный вызов, выполняемый до того, как фрагмент станет полностью доступным, поэтому вы обязательно получите последнее восстановление currentSelection.

Другие вопросы по тегам