Для нескольких вкладок один фрагмент не работает getItem вызывается дважды

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

Я передал аргументы от getItem. он передает аргументы два раза, как getItem вызывает дважды. таким образом это переопределяет данные аргументов. У меня есть 6 вкладок, но только на вкладках 1, 3 и 5 отображаются данные, но данные вкладок 2, 4 и 6 и вкладок 2, 4 и 6 не отображают ничего на экране.

не работает ни одно решение из предыдущих вопросов.

Код ViewPager

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

int TAB_COUNT=5;
Context mContext;
public ViewPagerAdapter(FragmentManager fm,Context context) {
    super(fm);
    mContext=context;
}

@Override
public Fragment getItem(int position) {
    NewsFragment fragment = new NewsFragment();
    Bundle args = new Bundle();
    args.putString("title", String.valueOf(getPageTitle(position)));
    args.putString("data", "data");
    fragment.setArguments(args);
    return fragment;

}

@Override
public CharSequence getPageTitle(int position) {

    return  mContext.getResources().getStringArray(R.array.tabs)[position];
}

@Override
public int getCount() {
    return TAB_COUNT;
}

}

Слушатели, чтобы изменить вкладку:

@Override
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());

}



@Override
public void onPageSelected(int position) {

    TabLayout.Tab tab = tabLayout.getTabAt(position);
    if (tab != null) {
        tab.select();
    }
}

Настройка адаптера

 private void setUpTab() {
    viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), this);
    for (int i = 0; i < viewPagerAdapter.getCount(); i++) {
        tabLayout.addTab(
                tabLayout.newTab()
                        .setText(viewPagerAdapter.getPageTitle(i)));
    }
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    viewPager.setAdapter(viewPagerAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    viewPager.addOnPageChangeListener(this);
    tabLayout.addOnTabSelectedListener(this);
}

1 ответ

getItem вызывается каждый раз, когда адаптер создает новую страницу в первый раз. Причина, по которой вы видите, что он вызывается дважды, заключается в том, что viewPager заранее подготавливает следующую страницу, поэтому, если вы заходите на страницу 1, страница 2 уже создается и для быстрой подкачки страниц, когда вы проводите вправо.

Чтобы помочь вам, пожалуйста, покажите нам код для NewsFragment.

Кроме того, вы можете рассмотреть возможность использования FragmentPagerAdapter вместо FragmentStatePagerAdapter, потому что у вас фиксированное количество вкладок (5 в вашем примере) и в соответствии с документацией, которая используется для FragmentPagerAdapter.

Документация со страницы, на которую я ссылался выше:

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

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