1

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

现在的问题是该getItem()方法CustomPagerAdapter只被调用一次,即。仅当我第一次单击用户部分时,NavigationDrawer但在导航后尝试再次打开它时getItem()不会被调用,因此在ViewPager.

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

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

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

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 打开用户

第二次从 NavigaiontDrawer 打开用户:

第二次从 NavigaiontDrawer 打开用户

4

1 回答 1

0

好的,问题解决了。我刚刚从 更改FragmentPagerAdapterFragmentStatePagerAdapter

问题FragmentPagerAdapter在于它只创建Fragments一次,下一次恢复它。那应该可以正常工作,但是我又多了一层,NavigationDrawer所以Pager当我从 NavigationDrawer 更改部分时,事情变得一团糟,并且 FragmentPagerAdapter 既不获取片段也不创建新片段。

于 2015-03-22T19:48:25.690 回答