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

痞子三分冷 提交于 2020-02-02 11:09:47

问题


UPDATE 2: Getting rid of all v4 support references fixed it. UPDATE: I started from scratch to see what triggers this behavior. It occurs once I add a check for location permissions. I can't go backwards -- even when I strip out all the permissions code it stays with the incorrectly-bahaving FragmentStatePagerAdapger.

I have a FragementStatePagerAdapter that was working just fine for a ViewPager of dynamically created fragments until I changed my compileSdkVersion and target SdkVersion from 22 to 23, using appcompat-v7:23.2.1. Now if I attempt to load, say, A, B, C it loads B, B, C. But then if I swipe back I get C, B, A. So it is only the initial attempt to load dynamically-created fragment A that is unsuccessful.

Here is how I set my adapter and 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);
    }
}

And instantiating the Fragment:

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

Has anyone else experienced this after upgrading? I am at a total loss after spinning my wheels on this for hours.


回答1:


The idea that I posted as a comment resolved the problem, here is the same answer with a few more details...

Short version: in adapters derived from FragmentStatePagerAdapter, try to use FragmentManager instead of SupportFragmentManager. Unless you're 100% sure you need the SupportFragmentManager.

Explanation:

code in the question looks pretty good. The only place where adapter can 'confuse' fragments is the method instantiateItem(ViewGroup container, int position). This method uses a FragmentManager passed as an argument of constructor. So we can blame that suspicious SupportFragmentManager.




回答2:


To add to the answer from DmitryO, you should use FragmentManager if you are using android.app.Fragment, and use SupportFragmentManager if you are using android.support.v4.app.Fragment, simple as that.

Both can be used in conjunction with the Support Library, i.e. you can put either type of Fragment in an AppCompatActivity. Also note that if you want to use android.app.Fragment native Fragments with a FragmentPagerAdapter or FragmentStatePagerAdapter, you need to use the v13 support library versions of the adapter, i.e. android.support.v13.app.FragmentStatePagerAdapter.

Note, this was originally posted as a comment, but I didn't want this info to get lost.



来源:https://stackoverflow.com/questions/36233429/fragmentstatepageradapter-first-call-to-getitem-wrong-with-sdk-22-23-upgrade

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!