TabLayout与ViewPager使用是TabLayout标题不显示

使用如下两步后造成TabLayout的标题没有显示

  1. mTablayout.addTab(mTablayout.newTab().setText(titles.get(i)));
  2. mTablayout.setupWithViewPager(mViewPager);
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_coordinator_layout);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final ActionBar ab = getSupportActionBar();
        ab.setDisplayHomeAsUpEnabled(false);
        mViewPager = findViewById(R.id.viewpager);
        initViewPager();
    }

    private void initViewPager() {
        mTablayout = findViewById(R.id.tabs);
        List<String> titles = new ArrayList<>();
        titles.add("体育");
        titles.add("巴萨");
        titles.add("购物");
        titles.add("明星");
        titles.add("视频");
        titles.add("健康");
        titles.add("励志");
        titles.add("图文");
        titles.add("本地");
        titles.add("动漫");
        titles.add("搞笑");
        titles.add("精选");
        for (int i = 0; i < titles.size(); i++) {
            mTablayout.addTab(mTablayout.newTab().setText(titles.get(i)));
        }
        
        final List<Fragment> fragments = new ArrayList<>();
        for (int i = 0; i < titles.size(); i++) {
            fragments.add(new ListFragment());
        }

        MyAdapter mAdapter = new MyAdapter(getSupportFragmentManager(),0, fragments);
        mViewPager.setAdapter(mAdapter);

        mTablayout.setupWithViewPager(mViewPager);

从TabLayout中的setupWithViewPager(@Nullable ViewPager viewPager)开始分析

首先

 public void setupWithViewPager(@Nullable ViewPager viewPager) {
        this.setupWithViewPager(viewPager, true);
    }

最终调用了

private void setupWithViewPager(@Nullable ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) {
           ...
            if (adapter != null) {
                this.setPagerAdapter(adapter, autoRefresh);
            }
           ...
    }

主要是setPagerAdapter方法中调用了this.populateFromPagerAdapter();

void setPagerAdapter(@Nullable PagerAdapter adapter, boolean addObserver) {
        if (this.pagerAdapter != null && this.pagerAdapterObserver != null) {
            this.pagerAdapter.unregisterDataSetObserver(this.pagerAdapterObserver);
        }

        this.pagerAdapter = adapter;
        if (addObserver && adapter != null) {
            if (this.pagerAdapterObserver == null) {
                this.pagerAdapterObserver = new TabLayout.PagerAdapterObserver();
            }

            adapter.registerDataSetObserver(this.pagerAdapterObserver);
        }

        this.populateFromPagerAdapter();
    }

接下来看populateFromPagerAdapter();

void populateFromPagerAdapter() {
        this.removeAllTabs();
        if (this.pagerAdapter != null) {
            int adapterCount = this.pagerAdapter.getCount();

            int curItem;
            for(curItem = 0; curItem < adapterCount; ++curItem) {
                this.addTab(this.newTab().setText(this.pagerAdapter.getPageTitle(curItem)), false);
            }

            if (this.viewPager != null && adapterCount > 0) {
                curItem = this.viewPager.getCurrentItem();
                if (curItem != this.getSelectedTabPosition() && curItem < this.getTabCount()) {
                    this.selectTab(this.getTabAt(curItem));
                }
            }
        }

    }

在此方法中this.removeAllTabs();移除了所有的TabItem,然后重新添加
this.addTab(this.newTab().setText(this.pagerAdapter.getPageTitle(curItem)), false);
所以造成前面设置的标题全部清除了;

解决办法是在setupWithViewPager函数调用后再设置tab的标题,并在之前不需要 执行mTablayout.addTab(mTablayout.newTab().setText(titles.get(i)));

解决方法:
1.mTablayout.setupWithViewPager(mViewPager);
2.for (int i = 0; i < titles.size(); i++) {
mTablayout.getTabAt(i).setText(titles.get(i));
}

发布了13 篇原创文章 · 获赞 2 · 访问量 585

猜你喜欢

转载自blog.csdn.net/qq_42806685/article/details/103424377
今日推荐