Для нескольких вкладок один фрагмент не работает 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.
Документация со страницы, на которую я ссылался выше:
Эта версия пейджера лучше всего подходит для использования, когда имеется несколько статических фрагментов, которые нужно пролистать, например, набор вкладок.