【问题标题】:Data not showing after navigation back to the previous tab导航回上一个选项卡后未显示数据
【发布时间】:2021-02-17 23:37:22
【问题描述】:

我遇到了一个问题,当我从一个选项卡导航到另一个选项卡然后返回上一个选项卡时,我的数据不再显示在片段中。

这些是我的 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));

这些是我创建的片段适配器

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;
}

当我单击预订选项卡并导航回上一个选项卡后,今日预订的片段不会显示。

【问题讨论】:

  • super(fm, numoftabs); 第二个参数是一种行为,而不是标签的数量。
  • 可以在 onResume() 方法中设置数据。当回到上一个选项卡时,调用 onResume()。我不知道这是最好的方法。
  • 在您的 getItem() 方法中,您每次都返回一个新的 Fragment 实例。因此,您的“Todaybooking”Fragment 和“Booking”Fragment 的先前实例已“丢失”(以及其中存储的任何状态)。查看ViewPager2,因为它旨在解决原始ViewPager(以及与ViewPager 一起使用的Adapter)的许多问题。

标签: android android-fragments android-viewpager android-tablayout


【解决方案1】:

这可能是因为您在getItemPosition 中返回POSITION_NONE,即

当宿主视图试图确定一个项目的位置是否改变时调用。如果给定项目的位置未更改,则返回 POSITION_UNCHANGED;如果该项目不再存在于适配器中,则返回 POSITION_NONE。

来自https://developer.android.com/reference/androidx/viewpager/widget/PagerAdapter#getItemPosition(java.lang.Object)

所以删除getItemPosition的覆盖,你通常不需要这个。

因为您表明每个 Fragment 的当前实例不再在 Fragment 列表中,所以每次访问包含它的 Tab 时都会重新创建 Fragment。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2017-07-11
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多