Viewpage + tablayout:为什么片段2 3在片段1被调用时开始?

时间:2016-04-04 09:51:09

标签: android android-fragments

Tablayout

当我开始申请时,Tab Home开始了,但是选项CungHoàngĐạo也开始了。当我选择标签CungHoàngĐạo然后tab 12 Con Giap和TửVi开始。

我希望他们只有在被选中时才能开始。 对不起我的语法。 谢谢大家。

这是我的代码:

public class ViewPageContainerFragment extends BaseFragment {
    private ViewPager viewPager;
    private TabLayout tabLayout;
    private final String TAG = getClass().getSimpleName();
    private  ViewPagerAdapter adapter;
    private boolean[] isTabsSelected = new boolean[5];
    private OnTabChangeListener mOnTabChangeListener;
    private int countSelectedTab = 1;
    @Override
    public void init() {
        tabLayout =  (TabLayout)getView().findViewById(R.id.tab_layout);
        viewPager =  (ViewPager) getView().findViewById(R.id.view_pager);
        adapter = new ViewPagerAdapter(getFragmentManager());
    }

    @Override
    public void setEvent() {
        setupViewPager(viewPager);
        isTabsSelected[0] = true;
        tabLayout.setupWithViewPager(viewPager);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "onPageSelected: "+position);
                if (position != 0) {
                    if (!isTabsSelected[position]
                            && adapter.getItem(position).getChildFragmentManager().getBackStackEntryCount() == 1
                            && getCurrentFragment(position) instanceof OnTabChangeListener) {
                        mOnTabChangeListener = (OnTabChangeListener) getCurrentFragment(position);
                        mOnTabChangeListener.onTabSelected();
                    }
                } else if (adapter.getItem(0).getChildFragmentManager().getBackStackEntryCount() == 1) {
                    Log.d(TAG, "position = 0");
                }
                if (!isTabsSelected[position]) {
                    isTabsSelected[position] = true;
                    countSelectedTab++;
                    viewPager.setOffscreenPageLimit(countSelectedTab);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }

    @Override
    public void setValue() {

    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_viewpage;
    }
    private void setupViewPager(ViewPager viewPager) {
        adapter.addFrag(new HomeContainerFragment(), "Home");
        adapter.addFrag(new CungHoangDaoContainerFragment(), "Cung Hoàng Đạo");
        adapter.addFrag(new ConGiapContainerFragment(), "12 Con Giáp");
        adapter.addFrag(new TuViContainerFragment(), "Tử Vi");
        viewPager.setAdapter(adapter);
    }
    public Fragment getCurrentFragment(int position) {
        FragmentManager fm = getChildFragmentManager();
        return fm.findFragmentById(R.id.container_framelayout);
    }
    public interface OnTabChangeListener {
        void onTabSelected();
    }
}

3 个答案:

答案 0 :(得分:1)

默认情况下,ViewPager会预先加载几页以便更顺畅地导航。您可以通过扩展ViewPager并覆盖 setOffscreenPageLimit 方法来自定义此行为:

文档链接Here

  

public void setOffscreenPageLimit(int limit)

     

将处于空闲状态的视图层次结构中当前页面任一侧应保留的页数设置为空闲状态。页面超出此范围   在需要时,将从适配器重新创建限制。

     

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。

     

您应该将此限制保持在较低水平,尤其是在您的网页布局复杂的情况下。此设置默认为1.

答案 1 :(得分:1)

setOffscreenPageLimit()不起作用。您必须停止ViewPager的预加载,这意味着ViewPager需要懒惰地加载数据。就像这样。

public class FragmentSample extends Fragment{
    ...  
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
           // load your data
        }
    }
    ...
}

答案 2 :(得分:0)

setupViewPager(ViewPager viewPager)方法中,添加此内容 -

viewPager.setOffscreenPageLimit(1);

来自文档,

  

设置应保留在页面两侧的页数   处于空闲状态的视图层次结构中的当前页面。页面超出此范围   在需要时,将从适配器重新创建限制。