#android #android-fragments #android-viewpager #android-tablayout
#Android #android-фрагменты #android-viewpager #android-tablayout
Вопрос:
Я столкнулся с проблемой, когда мои данные больше не отображаются во фрагменте, когда я перехожу с одной вкладки на другую вкладку, а затем возвращаюсь к предыдущей вкладке.
Это код для моего tablayout и viewpager
tabLayout = (TabLayout) findViewById(R.id.tablayout);
Todaybooking = (TabItem) findViewById(R.id.Tab1);
Booking = (TabItem) findViewById(R.id.Tab2);
viewPager = findViewById(R.id.viewpager);
pagerAdapter = new FragmentAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(pagerAdapter);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
if(tab.getPosition() == 0){
pagerAdapter.notifyDataSetChanged();
} else if (tab.getPosition() == 1){
pagerAdapter.notifyDataSetChanged();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
Это созданный мной fragmentadapter
public class FragmentAdapter extends FragmentPagerAdapter {
private int numoftabs;
public FragmentAdapter(@NonNull FragmentManager fm, int numoftabs) {
super(fm, numoftabs);
this.numoftabs = numoftabs;
}
@NonNull
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return new Todaybooking();
case 1:
return new Booking();
default:
return null;
}
}
@Override
public int getCount() {
return numoftabs;
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
Фрагмент сегодняшнего бронирования не отображается, как только я нажимаю вкладку бронирования и возвращаюсь к предыдущей вкладке.
Комментарии:
1.
super(fm, numoftabs);
Второй аргумент — это поведение, а не количество вкладок.2. Вы можете установить данные в методе onResume(). Когда когда-либо вернетесь к предыдущей вкладке, вызовите onResume(). Я не знаю, что это лучший способ.
3. В вашем
getItem()
методе выFragment
каждый раз возвращаете новый экземпляр. Таким образом, предыдущие экземпляры ваших «Todaybooking»Fragment
и «Booking»Fragment
«потеряны» (и любые состояния, сохраненные в них). Посмотрите,ViewPager2
поскольку он направлен на решение многих проблем, которые были у оригиналаViewPager
(наряду сAdapter
используемым withViewPager
).
Ответ №1:
Вероятно, это связано с тем, что вы возвращаетесь POSITION_NONE
, в getItemPosition
котором
Вызывается, когда представление хоста пытается определить, изменилась ли позиция элемента. Возвращает POSITION_UNCHANGED, если позиция данного элемента не изменилась, или POSITION_NONE, если элемент больше не присутствует в адаптере.
Поэтому удалите переопределение getItemPosition
, которое вам обычно не нужно.
Поскольку вы указываете, что текущего экземпляра каждого фрагмента больше нет в списке фрагментов, это приведет к повторному созданию фрагмента при каждом посещении вкладки, которая его содержит.