FragmentPagerAdapter总是加载下一个片段而不是当前的片段

4
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_dictionary);

    getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    setupNavMenu();
}

private void setupViewPager(ViewPager viewPager) {
    adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new A(), "A");
    adapter.addFragment(new B(), "B");
    adapter.addFragment(new C(), "C");
    adapter.addFragment(new D(), "D");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

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

问题是:当我启动活动时,我会得到第一个片段的视图(A),但下一个片段(B)没有加载视图,因此当我滑动到下一个视图(B)时,我得到了在前一个片段中加载的视图,所以现在它加载了片段C......
问题在于片段B的内容取决于片段A中的输入(数据保存在共享首选项中),因此我总是在片段B中获得默认值,因为它在片段A中被加载。
当我在片段D中时,这个错误也是一样的,所以当我向左滑动到片段C时,它将显示片段C并且还会加载片段B。

这不是一个 bug。请查看下面的答案。 - IntelliJ Amiya
当您输入第一个片段的数据后,请再次替换您的片段。 - Vivek Mishra
3个回答

1

这不是一个错误,而是viewpager的默认功能。对于每个第n页,第(n-1)页和第(n+1)页会自动加载。我认为没有直接的方法可以实现你想要的效果。


0
在你的ViewPagerAdapter中,重写方法:getItemPositionreturn POSITION_NONE

0
最好的方式是使用自定义的onSwipeListener而不是ViewPager,并且手动加载碎片。
但是对于ViewPager,你可以使用一个技巧:
在保存了A片段中的数据之后,
    viewPager.setAdapter(adapter);

这将重新加载所有的片段。

不要忘记先保存当前的页面位置。 重置后,设置页面位置,这样每次都不会回到第一个位置。 虽然不是很好的编码方式,但应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接