Fragger Pager Adapter, отображающий только последний созданный фрагмент - PullRequest
0 голосов
/ 16 марта 2019

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

У меня есть приложение с TabLayout, которое отображает 3 фрагмента. 3 фрагмента имеют одинаковый макет, но содержимое (текст и т. Д.) Указанных макетов изменяется в зависимости от положения в TabLayout. Вкладка 1 отображает одну вещь, вкладка 2 - другую и т. Д. Я делаю это, передавая тот или иной класс фрагменту, который будет отображаться, в зависимости от позиции, переданной getItem () в адаптере пейджера.

Что я вижу, так это то, что независимо от того, какие фрагменты я пытаюсь загрузить, мой макет вкладки всегда будет отображать 3 экземпляра одного и того же фрагмента, в данном случае последний, который создается. Я прошел по коду и, конечно же, три различных фрагмента были созданы и возвращены в getItem () трижды вызванным, но только тот, который был возвращен последним, устанавливается на TabLayout 3 раза.

Как я могу заставить его отображать 3 разных фрагмента, а не один и тот же 3 раза?

Используемый код:

@Override
public Fragment getItem(int position) {

    MyFragment fragment = new MyFragment();

    if (position == 0) {
        fragment = MyFragment.newInstance(MyClass1, position); // this gets returned first
    } else if (position == 1){
        fragment = MyFragment.newInstance(MyClass2, position); // this gets returned second
    } else if (position == 2){
        fragment = MyFragment.newInstance(MyClass3, position); // this gets returned third and is the only fragment displayed in the 3 tabs
    }
    return fragment;
}

Я считаю, что проблема должна быть где-то там, но скажите мне, если мне нужно поделиться / изменить другие части кода

РЕДАКТИРОВАТЬ : Это моя функция newInstance () в моем классе фрагментов

public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
    MyFragment fragment = new MyFragment();
    dataClass = inputClass;
    position = inputPosition;
    return fragment;
}

dataClass затем используется для настройки макета фрагмента и т. Д.

Ответы [ 3 ]

0 голосов
/ 16 марта 2019

код можно поставить вот так

 public Fragment getItem(int i)
{
    switch (i)
    {
        case 0:
             Fragment fragment1=new Fragment();
            return fragment1;
        case 1:
            Fragment fragment2=new Fragment();
            return fragment2;
        case 2:
            Fragment fragment3=new Fragment();
            return fragment3;
        default:
                return null;

    }
}
0 голосов
/ 16 марта 2019
public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
    MyFragment fragment = new MyFragment();
    dataClass = inputClass;
    position = inputPosition
    return fragment;
}

Если это действительно компилируется, то это потому, что вы объявили dataClass и position как static.Таким образом, каждый раз, когда вы вызываете newInstance(), вы перезаписываете предыдущие значения dataClass и position.И каждый из ваших фрагментов будет использовать единственное значение dataClass и position.

. Чтобы это исправить, избавьтесь от полей dataClass и position и используйте аргументы Bundle.Обратите внимание, что вам нужно будет перейти от передачи экземпляра MyClass к передаче некоторого идентификатора, который позволит фрагменту получить правильные данные (например, enum).

0 голосов
/ 16 марта 2019

У нас есть метод во фрагменте, который называется getUsetVisibleHint () .., используя его, когда фрагмент виден, мы можем вызвать api или получить данные и прикрепить к макету ..

...