Android 单击NavigationView项目时,如何更改TableLayout下的viewpager? 我的UI包含内容部分和导航部分。内容部分包含一个工具栏、一个tablayout和一个viewpager

Android 单击NavigationView项目时,如何更改TableLayout下的viewpager? 我的UI包含内容部分和导航部分。内容部分包含一个工具栏、一个tablayout和一个viewpager,android,android-fragments,Android,Android Fragments,我的工作流程 当我单击NavigationView中的项目时,UI通过调用以下“setUpTab”方法将viewpager中的片段替换为其他新片段。核心代码是: public void setUpTab(int id){ adapter.clear(); switch (id){ case R.id.nav_home: adapter.addFragment(new EventFragment(),"Events");

我的工作流程 当我单击NavigationView中的项目时,UI通过调用以下“setUpTab”方法将viewpager中的片段替换为其他新片段。核心代码是:

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);
    }
}
public void设置选项卡(int-id){
适配器。清除();
开关(id){
案例R.id.nav_主页:
addFragment(新的EventFragment(),“Events”);
addFragment(新的OwnRepoFragment(),“Repository”);
addFragment(新的ContributeRepoFragment(),“Contribute”);
打破
案例R.id.nav_朋友:
addFragment(新的FollowerFragment(),“Follower”);
addFragment(新的followFragment(),“Following”);
打破
案例R.id.nav_要点:
打破
案例R.id.nav_设置:
打破
案例R.id.nav_关于:
打破
}
adapter.notifyDataSetChanged();
选项卡.设置WithViewPager(viewpager);
}
静态类适配器扩展FragmentPagerAdapter{
私有最终列表MFFragments=new ArrayList();
私有最终列表MFFragmentTitles=new ArrayList();
公共适配器(FragmentManager fm){
超级(fm);
}
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitles.add(标题);
}
公共空间清除(){
mFragments.clear();;
MFFragmentTitles.clear();;
}
@凌驾
公共片段getItem(int位置){
返回mFragments.get(位置);
}
@凌驾
public int getCount(){
返回mffragments.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitles.get(位置);
}
}
问题: 我想在片段再次插入到viewpager时加载数据(插入发生在调用“adapter.addFragment()”时)。 我在生命周期方法中启动了数据加载线程。但是似乎生命周期方法(onCreate,onResume)并不总是被调用。所以我没有机会启动数据加载线程


如何替换viewpager中的片段并使片段通过正常的生命周期方法:onCreate、onCreateView、onResume?

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

最后,我修复了它

步骤1: 使用FragmentStatePagerAdapter而不是FragmentPagerAdapter

步骤2: 实现getItemPosition,如下所示:

 @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }
步骤3:
调用Viewpager的setOffscreenPageLimit(inti)保存状态。

我知道onCreate和onCreateView之间的关系,我将数据加载线程放在onCreateView中。但问题是,当片段返回viewpager时,它的onCreate、onCreateView和onResume没有被调用。我们遇到了类似的问题,并改为FragentStatePagerAdapter起作用,但背后的解释/逻辑是什么那个