Android 防止FragmentView加载RecyclerView,直到其聚焦?

Android 防止FragmentView加载RecyclerView,直到其聚焦?,android,tabs,Android,Tabs,我的应用程序中有一个简单的片段视图和3个选项卡。所有3个选项卡都有RecyclerView,问题是前两个选项卡没有那么复杂,而第三个选项卡使用了一些复杂的操作,使应用程序在执行这些操作时变慢。我的问题是:如何防止FragmentView调用onCreateView,直到它被聚焦? 现在,第三个选项卡在第二个选项卡聚焦时开始执行这些操作。我希望它在第三个选项卡被聚焦时开始执行这些方法。 这是我的代码: tabLayout = (TabLayout) findViewById(R.id.tab_la

我的应用程序中有一个简单的
片段视图和3个选项卡。所有3个选项卡都有
RecyclerView
,问题是前两个选项卡没有那么复杂,而第三个选项卡使用了一些复杂的操作,使应用程序在执行这些操作时变慢。我的问题是:如何防止
FragmentView
调用
onCreateView
,直到它被聚焦? 现在,第三个选项卡在第二个选项卡聚焦时开始执行这些操作。我希望它在第三个选项卡被聚焦时开始执行这些方法。 这是我的代码:

tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        adapter = new PagerAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
这是我的适配器:

public class PagerAdapter extends FragmentStatePagerAdapter  {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                RingtonesActivityFragment Ringtones = new RingtonesActivityFragment();
                return Ringtones;
            case 1:
                FavoritesActivityFragment Favorites = new FavoritesActivityFragment();
                return Favorites;
            case 2:
                MySongsActivityFragment Songs = new MySongsActivityFragment();
                return Songs;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}
和选项卡:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View rootView = inflater.inflate(R.layout.main, container, false);
...
...
...
         return rootView;

    }

默认情况下,
ViewPager
将在当前页面的任意一侧加载一页。即使将
setOffscreenPageLimit
设置为小于1,它也会将自身重置为1。除非您根据自己的喜好修改
ViewPager
类,否则无法绕过此问题

要帮助延迟执行代码,您可以使用
ViewPager.OnPageChangeListener
及其方法
onPageSelected(int position)
找出当前处于焦点的选项卡。一旦
片段
处于焦点位置,您就可以推迟所需的工作


我还补充说,如果你正在做导致UI滞后的工作,你可能想考虑把工作移到后台线程。如果工作与布局相关,而您无法在后台线程上完成,请使用层次结构查看器或Systrace帮助您进行优化。

ViewPager
默认情况下将在当前页面的任意一侧加载一页。即使将
setOffscreenPageLimit
设置为小于1,它也会将自身重置为1。除非您根据自己的喜好修改
ViewPager
类,否则无法绕过此问题

要帮助延迟执行代码,您可以使用
ViewPager.OnPageChangeListener
及其方法
onPageSelected(int position)
找出当前处于焦点的选项卡。一旦
片段
处于焦点位置,您就可以推迟所需的工作


我还补充说,如果你正在做导致UI滞后的工作,你可能想考虑把工作移到后台线程。如果工作与布局相关,而您无法在后台线程上完成,请使用Hierarchy Viewer或Systrace帮助您进行优化。

这不是问题,因为该选项卡上有进度条和文本,可以告诉用户应用程序正在做什么,但如果该选项卡被激活而未显示,则会出现短暂的延迟,4-5秒,但由于应用程序非常简单,因此仍然可能很烦人。而且,没有任何理由可以拖延。我将对此进行调查,如果没有更好的答案或解决办法,我将接受你的答案。Thanks@SlimC. 4-5秒对于用户体验来说是一个很大的滞后。这么多的工作不应该发生在主线程上。是的,但在此期间用户不能做任何事情。将其视为加载屏幕。我只是在后台检查了一下,不过是的,虽然加载时间很大程度上取决于用户有多少文件。数字越大,完成所需的时间就越长。这不是问题,因为该选项卡上有进度条和文本来告诉用户应用程序正在做什么,但如果该选项卡被激活且未显示,则会出现短暂的延迟,即4-5秒,但由于应用程序非常简单,因此仍然可能很烦人。而且,没有任何理由可以拖延。我将对此进行调查,如果没有更好的答案或解决办法,我将接受你的答案。Thanks@SlimC. 4-5秒对于用户体验来说是一个很大的滞后。这么多的工作不应该发生在主线程上。是的,但在此期间用户不能做任何事情。将其视为加载屏幕。我只是在后台检查了一下,不过是的,虽然加载时间很大程度上取决于用户有多少文件。数字越大,完成所需的时间越长。