【问题标题】:How to change the viewpager under tablayout when I click the NavigationView item?单击 NavigationView 项时如何更改 tablayout 下的 viewpager?
【发布时间】:2015-07-16 13:38:21
【问题描述】:

我的 UI 包含内容部分和导航部分。内容部分包含一个工具栏、一个tablayout和一个viewpager。它看起来像

我的工作流程

当我单击 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);
    }
}

问题

我想在片段再次插入视图页面时加载数据(插入发生在我调用“adapter.addFragment()”时)。 我在生命周期方法中启动了数据加载线程。但是似乎并不总是调用生命周期方法(onCreate,onResume)。所以我没有机会启动数据加载线程。

如何在viewpager中替换fragment,让fragment通过正常的生命周期方法:onCreate,onCreateView,onResume?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    最后,我修复它。

    第 1 步:

    使用 FragmentStatePagerAdapter 代替 FragmentPagerAdapter

    第 2 步:

    像这样实现 getItemPosition:

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

    第 3 步:

    调用 Viewpager 的 setOffscreenPageLimit(int i) 来保存状态。

    【讨论】:

    • 遇到了类似的问题,改成 FragentStatePagerAdapter 有效,但是这背后的解释/逻辑是什么?
    【解决方案2】:

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

    【讨论】:

    • 我知道onCreate和onCreateView之间的关系,我把数据加载线程放在onCreateView中。但是关键是当片段返回viewpager时,它的onCreate,onCreateView,onResume没有被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多