简体   繁体   中英

How to change the viewpager under tablayout when I click the NavigationView item?

My UI contains content part and navigation part. The content part contains a Toolbar,a tablayout and a viewpager.It looks like

正文内容是一个tablayout包装一个viewpager带项目的NavigationView

My Work Flow

When I click the item in NavigationView, the UI replace the fragment in viewpager with other new fragment by call the following "setUpTab" method. The core codes is :

public void setUpTab(int id){
    adapter.clear();
    switch (id){
        case R.id.nav_home:
            adapter.addFragment(new EventFragment(),"Events");
            adapter.addFragment(new OwnRepoFragment(),"Repository");
            adapter.addFragment(new ContributeRepoFragment(),"Contribute");
            break;
        case R.id.nav_friends:
            adapter.addFragment(new FollowerFragment(),"Follower");
            adapter.addFragment(new FollowingFragment(),"Following");
            break;
        case R.id.nav_gist:
            break;
        case R.id.nav_setting:
            break;
        case R.id.nav_about:
            break;
    }
    adapter.notifyDataSetChanged();
    tab.setupWithViewPager(viewpager);
}
 static class Adapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragments = new ArrayList<>();
    private final List<String> mFragmentTitles = new ArrayList<>();

    public Adapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragments.add(fragment);
        mFragmentTitles.add(title);
    }
    public void clear(){
        mFragments.clear();;
        mFragmentTitles.clear();;
    }


    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitles.get(position);
    }
}

Question

I want to load data when a fragment is insert into the viewpager again(The insertion happens when i call "adapter.addFragment()"). And I start the data-loading Thread in the life cycle method.But it seems that the life Cycle Methods(onCreate,onResume) are not always called.So I fail to get the chance to start the data-loading Thread.

How can I replace the fragment in viewpager and make the fragment go through the normal life cycle methods:onCreate,onCreateView,onResume ?

Finally,I fix it.

Step 1:

Use FragmentStatePagerAdapter instead of FragmentPagerAdapter

Step 2:

Implement getItemPosition like this:

 @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }

Step 3:

Call the Viewpager's setOffscreenPageLimit(int i) to save state.

将数据加载线程放入onCreateView而不是onCreate。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM