【问题标题】:FragmentPageAdapter works in a strange wayFragmentPagerAdapter 以一种奇怪的方式工作
【发布时间】:2015-02-18 09:46:11
【问题描述】:

由于在 Android L 中操作栏导航模式已被弃用,我正在寻找另一种方式来拥有选项卡,我发现可以使用 PagerTabStrip (android.support.v4.view.PagerTabStrip),所以我以这种方式创建了 FragmentPageAdapter:

public class TitleAdapter extends FragmentPagerAdapter {

    private final String titles[] = new String[] { "Home", "Events", "People", "Books"};
    private final Fragment frags[] = new Fragment[titles.length];
    Context context;
    public TitleAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Log.v("TitleAdapter - getPageTitle=", titles[position]);
        return titles[position];
    }

    @Override
    public Fragment getItem(int position) {
        Log.v("TitleAdapter - getItem=", String.valueOf(position));
        //return frags[position];
        switch (position) {
        case 0:
            return Home.newInstance(0, "Home");
        case 1:
            return Events.newInstance(1, "Events");
        case 2:
            return People.newInstance(2, "People");
        case 4:
            return Books.newInstance(3, "Books"); 
        }
        return null;
    }

    @Override
    public int getCount() {
        return frags.length;
    }
}

我在LogCat 中看到的奇怪方式是方法 getItem() 在mainActivity 启动时被调用了 4 次,所以我必须等待很多,因为在每个选项卡中都有一个很长的列表,而这个列表通过调用 Web 服务的 HTTP 请求填充。

我希望每次只加载一个片段,而不是全部。当我使用 actionbar.Tablistener 时,它是可能的,但现在该方法已被弃用,所以有没有办法做到这一点?

我是这样在onCreate方法中设置适配器和viewPager的:

@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.prova_page_tab_stripes);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);

        titleAdapter = new TitleAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(titleAdapter);
        mViewPager.setOffscreenPageLimit(1);
    }

【问题讨论】:

    标签: android android-viewpager android-5.0-lollipop android-tabs


    【解决方案1】:

    初始化的页数取决于ViewPagersetOffscreenPageLimit函数。根据http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int) 中的android 文档,

    public void setOffscreenPageLimit(整数限制)

    Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. Pages beyond this limit will be recreated from the adapter when needed. This is offered as an optimization. If you know in advance the number of pages you will need to support or have lazy-loading mechanisms in place on your pages, tweaking this setting can have benefits in perceived smoothness of paging animations and interaction. If you have a small number of pages (3-4) that you can keep active all at once, less time will be spent in layout for newly created view subtrees as the user pages back and forth. You should keep this limit low, especially if your pages have complex layouts. This setting defaults to 1. Parameters limit How many pages will be kept offscreen in an idle state.

    如果您想限制要保留的页面,请将其设置为 1 或保持默认值。

    但是如果您想一次只加载一页中的数据,您可以确定片段何时可​​见,然后加载数据(在onCreateView 中加载。) 参考这个问题:How to determine when Fragment becomes visible in ViewPager

    【讨论】:

    • 感谢您的回复。我已经尝试设置 setOffscreenPageLimit = 1 但所有片段仍在加载中。
    • 你能把初始化viewpager和设置适配器的代码贴出来吗?
    • 嗨 Abhshek 我已经编辑了我的问题,所以你可以看到我在哪里设置了适配器和 viewPager
    • 阿布舍克五世你摇滚。我刚刚尝试使用 setMenuVisibility,正如您在回答末尾建议我的那样,它运行良好。现在,当我单击您非常喜欢的选项卡时,列表已加载
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2017-01-17
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多