NavigationDrawer 中 PagerSlidingTabStrip 的奇怪行为

Weird behaviour of PagerSlidingTabStrip inside NavigationDrawer

当 activity 启动时它加载一个 NavigationDrawer 并且里面有 3 个部分。第一个有一个 RecyclerView 可以正常工作。第二个 PagerSlidingTabStrip 有问题。 3rd 有一些代码可以更改 PreferenceManager 并且效果很好。

现在的问题是 CustomPagerAdaptergetItem() 方法只被调用一次,即。仅当我第一次单击 NavigationDrawer 中的用户部分时,但在我尝试再次打开它时导航后 getItem() 未被调用,因此 ViewPager.[=26= 中未初始化任何内容]

然后我必须重新打开应用程序,PagerSlidingTabStrip 会工作一次。

请指导我。可能是什么问题?

更新: 我做了一些测试,发现 FragmentPagerAdaptergetItem() 在我第一次启动第 2 部分时只被调用一次,然后当我再次尝试启动它时它没有被调用。为什么会这样?

NavigationDrawer 部分:

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getFragmentManager();
        switch(position) {
            case 0: //Events
                fragmentManager.beginTransaction().replace(R.id.container,
                        EventsRecyclerViewFragment.newInstance(position + 1))
                        .addToBackStack(null).commit();
                break;

            case 1: //User
                fragmentManager.beginTransaction().replace(R.id.container,
                        UserFragment.newInstance(position + 1))
                        .addToBackStack(null).commit();
                break;

            case 2: //Logout
                prefs = PreferenceManager.getDefaultSharedPreferences(this);
                if(prefs.getBoolean(KEY_LOGIN, false)) {
                    prefs.edit().remove(KEY_LOGIN).apply();
                    prefs.edit().remove(KEY_USERNAME).apply();
                    prefs.edit().remove(KEY_PASSWORD).apply();
                    Intent intent = getIntent();
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    finish();
                    startActivity(intent);
                    Customs.mToast(getBaseContext(), "Logged-out");
                }
                break;
        }
}

第二节-UserFragment:

static class UserFragment extends Fragment {

        private static final String ARG_SECTION_NUMBER = "section_number";

        public static UserFragment newInstance(int sectionNumber) {
            UserFragment fragment = new UserFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_user, container, false);
            context = view.getContext();
            prefs = PreferenceManager.getDefaultSharedPreferences(view.getContext());
            return view;
        }

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {

            ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
            mViewPager.setAdapter(new CustomAdapter(getFragmentManager(),context));

            PagerSlidingTabStrip pagerSlidingTabStrip = (PagerSlidingTabStrip)view.findViewById(R.id.sliding_tabs);
            pagerSlidingTabStrip.setViewPager(mViewPager);
        }
    }

FragmentPagerAdapter - 自定义适配器:

public class CustomAdapter extends FragmentPagerAdapter {

    private SharedPreferences prefs;
    private Context context;
    private static final String KEY_USERNAME = "username",
            KEY_PASSWORD = "password", KEY_LOGIN = "loggedin";

    public CustomAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        prefs = PreferenceManager.getDefaultSharedPreferences(context);
        if(!prefs.getBoolean(KEY_LOGIN, false)) {
            prefs.edit().remove(KEY_USERNAME).apply();
            prefs.edit().remove(KEY_PASSWORD).apply();
            String[] pageTitle = {"Login", "Register"};
            return pageTitle[position];
        }
        String[] pageTitle = {"Update", "Register"};
        return pageTitle[position];
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0:
                if(!prefs.getBoolean(KEY_LOGIN, false)) {
                    prefs.edit().remove(KEY_USERNAME).apply();
                    prefs.edit().remove(KEY_PASSWORD).apply();
                    return LoginFragment.newInstance(position + 1);
                }
                else {
                    return UpdateFragment.newInstance(position + 1);
                }

            case 1:
                return RegisterFragment.newInstance(position + 1);
        }
        return null;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //container.removeView((View) object);
        FragmentManager manager = ((Fragment)object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment)object);
        trans.commit();
    }
}

导航抽屉:

第一次从 NavigaiontDrawer 打开用户:

第二次从 NavigaiontDrawer 打开用户:

好的,问题解决了。我刚刚从 FragmentPagerAdapter 更改为 FragmentStatePagerAdapter

FragmentPagerAdapter 的问题在于它只创建了一次 Fragments,下次它会恢复它。那应该工作正常但是我又在 Pager 上有一层 NavigationDrawer 所以当我从 NavigationDrawer 更改部分时有些东西变得混乱并且 FragmentPagerAdapter 既不获取片段也不创建新片段一个。