FragmentStatePagerAdapter首先调用getItem错误的sdk 22 - > 23升级

时间:2016-03-26 08:57:40

标签: android android-viewpager android-pageradapter fragmentstatepageradapter

更新2:删除所有v4支持引用修复它。 更新:我从头开始看看是什么触发了这种行为。一旦我添加了位置权限检查,就会发生这种情况。我不能倒退 - 即使我删除了所有权限代码,它仍与错误的pahaving FragmentStatePagerAdapger保持一致。

我有一个FragementStatePagerAdapter对于动态创建的片段的ViewPager工作正常,直到我使用appcompat-v7:23.2.1更改了我的compileSdkVersion并将SdkVersion从22改为23。现在,如果我尝试加载,比如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);

MyAdapter:

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

升级后还有其他人经历过这种情况吗?在将这些轮子旋转几个小时后,我完全失去了。

2 个答案:

答案 0 :(得分:2)

我发布评论的想法解决了这个问题,这里有相同的答案,还有一些细节......

简短版本:在源自FragmentStatePagerAdapter的适配器中,尝试使用FragmentManager代替SupportFragmentManager除非您100%确定需要SupportFragmentManager

<强> 说明:

问题中的代码看起来很不错。 adapter可能会混淆的唯一地方&#39;片段是方法instantiateItem(ViewGroup container, int position)。此方法使用FragmentManager作为构造函数的参数传递。因此,我们可以归咎于可疑的SupportFragmentManager

答案 1 :(得分:0)

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

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

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