如何在“选定项"选项卡上的FragmentPagerAdapter中禁用第一个Fragment的重新生成? [英] How to disable recreation of the first Fragment in FragmentPagerAdapter on tab Selected?

查看:84
本文介绍了如何在“选定项"选项卡上的FragmentPagerAdapter中禁用第一个Fragment的重新生成?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

onCreateView对于FragmentPagerAdapter中的第一个片段不是很快. 因此,将"curent"选项卡更改为第一个会有一个延迟.

onCreateView for my first fragment in the FragmentPagerAdapter is not very quick. So, changing curent tab to the first has a delay.

如何在已选择"选项卡上的FragmentPagerAdapter中禁用重新创建第一个片段?

How to disable recreate first Fragment in FragmentPagerAdapter on tab Selected?

private class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
    private final Context context;
    private ActionBar bar;
    private final ViewPager viewPager;
    private final ArrayList<TabInfo> tabs = new ArrayList<TabInfo>();

    final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        context = activity;
        bar = activity.getSupportActionBar();
        viewPager = pager;
        viewPager.setAdapter(this);
        viewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        tabs.add(info);
        bar.addTab(tab);
        notifyDataSetChanged();
    }

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

    @Override
    public Fragment getItem(int position) {
        TabInfo info = tabs.get(position);
        Fragment fragment = Fragment.instantiate(context, info.clss.getName(), info.args);
        return fragment;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
    @Override
    public void onPageScrollStateChanged(int state) {}

    @Override
    public void onPageSelected(int position) {
        bar.setSelectedNavigationItem(position);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        Object tag = tab.getTag();
        for (int i = 0; i < tabs.size(); i++) {
            if (tabs.get(i) == tag) 
                viewPager.setCurrentItem(i);
        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {}
    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {}
}

推荐答案

现在我遇到了同样的问题.

Right now i am stuck with the same problem.

当您使用 Tab:(n)时,只有 Tab:(n-1) Tab:(n + 1) >将在内存中保持活动状态,以优化内存使用率.其余所有选项卡将被销毁,这就是为什么当您回到第一个选项卡时,将再次调用其onCreateView的原因.

when you are on a Tab:(n), only Tab:(n-1) and Tab:(n+1) will be alive in the memory, for memory usage optimization. Rest all Tabs will be destroyed, thats the reason why when you come back to the first Tab, its onCreateView is being called again.

实际上,即使您单击 Tab:2 ,因为它是附近的Tab,实际上也会调用 Tab:1的 onCreateView.

Actually Tab:1's onCreateView will be called even if you click Tab:2 because its the neighbourhood Tab.

我得到的一个解决方案是:

One solution i got is:

更改ViewPager的 OffscreenPageLimit .其默认值为 1

change the OffscreenPageLimit of the ViewPager. Its default value is 1

viewPager.setOffscreenPageLimit(total no of Tabs - 1);

这样,所有选项卡都将保持活动状态,即使它处于关闭屏幕状态也是如此.但这仅在您没有没有制表符(< = 5)

This way all the Tabs will be alive even if its offScreen. But this is recommended only if you have decent no of Tabs(<=5)

如果您有大量的制表符,请更好地使用

If you have huge no.of Tabs, better use

FragmentStatePagerAdapter

这篇关于如何在“选定项"选项卡上的FragmentPagerAdapter中禁用第一个Fragment的重新生成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆