FragmentStatePagerAdapter 第一次调用 getItem 错误 sdk 22-->23 升级

FragmentStatePagerAdapter first call to getItem wrong with sdk 22-->23 upgrade

更新 2:删除所有 v4 支持参考修复了它。 更新:我从头开始查看触发此行为的原因。一旦我添加了对位置权限的检查,它就会发生。我不能倒退——即使我删除了所有权限代码,它仍然保留在错误行为的 FragmentStatePagerAdapger 中。

在我使用 appcompat-v7:23.2.1 将 compileSdkVersion 和目标 SdkVersion 从 22 更改为 23 之前,我有一个 FragementStatePagerAdapter 对于动态创建的片段的 ViewPager 工作得很好。现在,如果我尝试加载,比如说,A、B、C,它会加载 B、B、C。但是如果我向后滑动,我会得到 C、B、A。所以这只是加载动态创建的片段 A 的初始尝试那是不成功的。

这是我设置适配器和 viewpager 的方式:

myAdapter = new MyAdapter(getSupportFragmentManager(), numItems);
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(myAdapter);
viewPager.setCurrentItem(position);

我的适配器:

private class MyAdapter extends FragmentStatePagerAdapter {
    private final int size;

    public MyAdapter(FragmentManager fm, int _size)  {
        super(fm);
        size = _size;
    }

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

    @Override
    public Fragment getItem(int position) {
        String _id = myArray[position];
        return MyFragment.newInstance(_id);
    }
}

并实例化片段:

public static MyFragment newInstance(String _id)  {
        final MyFragment f = new MyFragment();
        final Bundle args = new Bundle();
        args.putString("_id", _id);
        f.setArguments(args);
        return f;
    }

...

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _id = getArguments().getString("_id");            
    }

有没有其他人在升级后遇到过这种情况?在我的轮子上旋转了几个小时后,我完全不知所措。

我作为评论发布的想法解决了这个问题,这里是相同的答案,但有更多细节...

简短版本:在从 FragmentStatePagerAdapter 派生的适配器中,尝试使用 FragmentManager 而不是 SupportFragmentManager除非您 100% 确定您需要 SupportFragmentManager

解释:

问题中的代码看起来不错。 adapter 唯一可以 'confuse' 碎片的地方是方法 instantiateItem(ViewGroup container, int position)。此方法使用 FragmentManager 作为 constructor 的参数传递。所以我们可以责怪那个可疑的 SupportFragmentManager.

要从 DmitryO 添加到 ,如果您使用 android.app.Fragment,则应使用 FragmentManager,如果您使用 android.support.v4.app.Fragment,则应使用 SupportFragmentManager,就这么简单。

两者都可以与支持库结合使用,即您可以将任一类型的 Fragment 放入 AppCompatActivity 中。 另请注意,如果您想将 android.app.Fragment 原生片段与 FragmentPagerAdapter 或 FragmentStatePagerAdapter 一起使用,则需要使用适配器的 v13 支持库版本,即 android.support.v13.app.FragmentStatePagerAdapter.

请注意,这最初是作为评论发布的,但我不希望此信息丢失。