Данные не отображаются после перехода к предыдущей вкладке

#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 используемым with ViewPager ).

Ответ №1:

Вероятно, это связано с тем, что вы возвращаетесь POSITION_NONE , в getItemPosition котором

Вызывается, когда представление хоста пытается определить, изменилась ли позиция элемента. Возвращает POSITION_UNCHANGED, если позиция данного элемента не изменилась, или POSITION_NONE, если элемент больше не присутствует в адаптере.

из https://developer.android.com/reference/androidx/viewpager/widget/PagerAdapter#getItemPosition(java.lang.Объект)

Поэтому удалите переопределение getItemPosition , которое вам обычно не нужно.

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