Один и тот же фрагмент вызывается несколько раз в ViewPager - PullRequest
1 голос
/ 20 июня 2019

У меня есть пейджер View. Пользователь может выбрать, сколько разных страниц он может иметь. Все страницы имеют одинаковый макет, но он просто загружает разные данные.

Вот мой фрагментный адаптер:

    public class FragmentAdapter extends FragmentPagerAdapter


{

    private final List<Fragment>  lstFragment = new ArrayList<>();
    private final List<String> lstTitles = new ArrayList<>();

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }


    @Override
    public Fragment getItem(int i) {
        return lstFragment.get(i);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return lstTitles.get(position);
    }

    @Override
    public int getCount() {
        return  lstTitles.size();
    }


    public void AddFragment (Fragment fragment , String title)
    {
        lstFragment.add(fragment);
        lstTitles.add(title);
    }
}

А вот код для многократного вызова фрагмента:

 FragAdapter = new FragmentAdapter(getSupportFragmentManager());

    viewPager = (ViewPager) findViewById(R.id.main_tabs_pager);
    toolbar = (Toolbar) findViewById(R.id.main_page_toolbar);
    tabLayout = (TabLayout) findViewById(R.id.main_tabs);

    String[] Fragments = {"Frag1", "Frag2", "Frag3", "Frag4"};

    for (int i=0; i<Fragments.length; i++)
    {
        ((FragmentAdapter) FragAdapter).AddFragment(new MenuFragment(),Fragments[i]);
    }


    viewPager.setAdapter(FragAdapter);
    tabLayout = (TabLayout) findViewById(R.id.main_tabs);
    tabLayout.setupWithViewPager(viewPager);

Так что работает нормально. Но единственная проблема в том, что я не знаю, как узнать разницу в коде между разными фрагментами.

Пример: Frag1 должен загрузить 5 картинок о море Frag2 должен загрузить 8 картинок о солнце

Как мне сказать фрагменту, что делать? Я попытался передать конструктору аргументы на примере

 public MenuFragment(int numberofpictures, String picturesthemes)
{
    // Required empty public constructor
}

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

у кого-нибудь есть идея? спасибо

ОБНОВЛЕНИЕ

Я не знаю, хороший ли это путь, но вот как я это сделал:

В основном виде деятельности, которую я создал:

 for (int i=0; i<Fragments.length; i++)
    {
        Bundle parameters = new Bundle();
        parameters.putInt("myInt", i);
        Fragment menuFragment = new MenuFragment();
        menuFragment.setArguments(parameters);
        ((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
    }

Которые дают каждому фрагменту int i, который является ссылкой на заголовок. Тогда я просто написал эту функцию:

 public String getName (int i)
{
    return Fragments[i];
}

, которые возвращают заголовок, основанный на int, который фрагмент получил благодаря связке

Затем, в MenuFragment () я использовал это:

 private void fillinthelist()
{

    myInt = getArguments().getInt("myInt");
    String test = ((MainActivity) getActivity()).getName(myInt);

    ListOfProgrammes.add(new Modele_carte(test));

}

, так что он получает int из пакета и делает его похожим благодаря функции в MainActivity

Это хороший способ сделать это? Вроде работает

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете прикрепить Bundle, содержащий параметры, с помощью setArguments (Bundle) :

Bundle parameters = new Bundle();
parameters.putInt("myInt", <int_value>);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(arguments);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);

Обычной практикой является сборка и присоединение Bundle в статической фабрике класса фрагмента.method.

Фрагмент может использовать getArguments () для получения параметров.

private int myInt;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myInt = getArguments().getInt("myInt");
}
...