首页 > 解决方案 > 其中一个片段无法立即更新来自其他片段的数据

问题描述

有顶部有四个选项卡的片段。每个选项卡都有自己的片段。我使用第一个、第二个、第三个选项卡的片段来收集保存在我的 SharedPreferences 的数据,并在第四个选项卡中接收它。

切换第四页时,我希望看到我从其他片段中选择的信息。我的问题是只有第一个选项卡可以立即将数据传递到第四页,无论我保存什么,它都可以立即显示在第四页,这就是我想要的。

然而,其他人很奇怪

我需要多一步才能切换到第一个选项卡,它甚至可以将我的数据从其他选项卡更新到第四页。

我的代码或订单有什么问题导致这种情况发生?

public class UserActivityMenuFragment extends Fragment {
public static final String[] sTitle = new String[]{"first","second","third","fourth"};


@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_activity,container ,false);
    initView(view);
    return view;
}


private void initView(View view) {
    ViewPager mViewPager = view.findViewById(R.id.containerView);
    TabLayout mTabLayout = view.findViewById(R.id.tabs);

    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[0]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[1]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[2]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[3]));


    mTabLayout.setupWithViewPager(mViewPager);
    List<Fragment> fragments = new ArrayList<>();
    fragments.add(FirstFragment.newInstance());
    fragments.add(SecondFragment.newInstance());
    fragments.add(ThirdFragment.newInstance());
    fragments.add(FourthFragment.newInstance());


    UserActivityMenuAdapter adapter = new UserActivityMenuAdapter(getChildFragmentManager(),fragments, Arrays.asList(sTitle));
    mViewPager.setAdapter(adapter);
    mViewPager.setOffscreenPageLimit(2);


    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {


        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

}

我的适配器

public class UserActivityMenuAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> mFragments ;
    private List<String> mTitles ;

    public UserActivityMenuAdapter
            (FragmentManager fm, List<Fragment> fragments, List<String> titles) {
        super(fm);
        mFragments = fragments;
        mTitles = titles;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments == null ?0:mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles.get(position);
    }
}

标签: javaandroidandroid-studioandroid-fragmentsandroid-viewpager

解决方案


ViewPager不会一次创建所有页面。您可以使用以下代码段强制它同时维护所有片段:

mViewPager.setOffscreenPageLimit(4);

推荐阅读