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

时间:2016-01-05 10:20:58

标签: android android-fragments

@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.

3 个答案:

答案 0 :(得分:1)

它不是一个错误,它是viewpager的默认功能。对于第n页(n-1)和第(n + 1)页,第n页自动加载。我不认为有任何直接的方式来实现你想要的。

答案 1 :(得分:0)

最好的方法是使用自定义onSwipeListener而不是ViewPager并自己加载片段..

但是对于ViewPager,您可以使用hack:

在片段A中保存数据后

    viewPager.setAdapter(adapter);

将重新加载所有片段。

不要忘记先保存当前的寻呼机位置。 重置后,设置寻呼机位置,这样您每次都不会回到第一个位置。 不好的编码,但它应该工作。

答案 2 :(得分:0)

在ViewPagerAdapter上

。覆盖方法:getItemPositionreturn POSITION_NONE