TabLayout+ViewPager实现联动的小问题

今天在做应用时想要利用TabLayout+ViewPager实现标签页,却遇到了一点小问题,

在使用  tabLayout.setupWithViewPager(vp_demo);这个方法使tablayout与viewpager联动时,发现我之前tablayout填充的title变为空白了。

原来是:

使用之后:

开始认为既然是空白就在使用了setupWithViewPager 方法之后重新添加。结果是空白标签右边多了几个标签。从图中的横线也能看出标签添加

是成功的,只是上面的title没有显示。

解决方法一:可以在调用setupWithViewPager之后分别设置title。

tabLayout.getTabAt(0).setText("今日推荐");
 tabLayout.getTabAt(1).setText("实用技巧");
tabLayout.getTabAt(2).setText("校园说说");  
 tabLayout.getTabAt(3).setText("时事热点");
虽然可以解决,但是有点不知道为什么,通过查看源码:

private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh,
        boolean implicitSetup) {
    if (mViewPager != null) {
        // If we've already been setup with a ViewPager, remove us from it
        if (mPageChangeListener != null) {
            mViewPager.removeOnPageChangeListener(mPageChangeListener);
        }
        if (mAdapterChangeListener != null) {
            mViewPager.removeOnAdapterChangeListener(mAdapterChangeListener);
        }
    }

    if (mCurrentVpSelectedListener != null) {
        // If we already have a tab selected listener for the ViewPager, remove it
        removeOnTabSelectedListener(mCurrentVpSelectedListener);
        mCurrentVpSelectedListener = null;
    }

    if (viewPager != null) {
        mViewPager = viewPager;

        // Add our custom OnPageChangeListener to the ViewPager
        if (mPageChangeListener == null) {
            mPageChangeListener = new TabLayoutOnPageChangeListener(this);
        }
        mPageChangeListener.reset();
        viewPager.addOnPageChangeListener(mPageChangeListener);

        // Now we'll add a tab selected listener to set ViewPager's current item
        mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager);
        addOnTabSelectedListener(mCurrentVpSelectedListener);

        final PagerAdapter adapter = viewPager.getAdapter();
        if (adapter != null) {
            // Now we'll populate ourselves from the pager adapter, adding an observer if
            // autoRefresh is enabled
            setPagerAdapter(adapter, autoRefresh);
        }
//代码省略。。。
看到调用了setPagerAdapter方法,查看源码:

private void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {
    if (mPagerAdapter != null && mPagerAdapterObserver != null) {
        // If we already have a PagerAdapter, unregister our observer
        mPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver);
    }

    mPagerAdapter = adapter;

    if (addObserver && adapter != null) {
        // Register our observer on the new adapter
        if (mPagerAdapterObserver == null) {
            mPagerAdapterObserver = new PagerAdapterObserver();
        }
        adapter.registerDataSetObserver(mPagerAdapterObserver);
    }

    // Finally make sure we reflect the new adapter
    populateFromPagerAdapter();
}

private void populateFromPagerAdapter() {
    removeAllTabs();//可以通过函数名看出,这个函数remove了tab

    if (mPagerAdapter != null) {
        final int adapterCount = mPagerAdapter.getCount();
        for (int i = 0; i < adapterCount; i++) {
            addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
                //通过上面函数可以看出,由于mPagetAdapter.getPagetTitle为空,所以在移除title之后,
                //set 空字符到 tab 所以tab为空,

 }

        // Make sure we reflect the currently set ViewPager item
        if (mViewPager != null && adapterCount > 0) {
            final int curItem = mViewPager.getCurrentItem();
            if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
                selectTab(getTabAt(curItem));
            }
        }
    }
}
//省略代码、、
通过查看源码,我们明白了原因,同时也找到另一种解决方法。给viewpager的adapter增加一个getPagTitle方法,我增加的如下

public String getPageTitle(int position){

    return  fragments.get(position).getTitle();
}
也可以正确解决问题。

总结:看源码,通常可以解决8 ,9 成自己遇到的问题。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值