TabLayout不反映ViewPager适配器的更改

时间:2016-02-13 15:47:23

标签: android android-viewpager android-tablayout

我想要一个标签式对话框。所以我在它下面添加了一个TabLayout和一个ViewPager。我创建了一个FragmentPagerAdapter,并使用它调用ViewPager的setAdapter()。然后我用ViewPager调用了TabLayout的setupWithViewPager()

现在,我增加了FragmentPagerAdapter的计数,并为其添加了一个新片段,并调用了notifyDataSetChanged()。问题是没有出现新选项卡。

在尝试了很多事情之后,我再次使用相同的ViewPager调用了TabLayout的setupWithViewPager()。它确实显示了新选项卡,但我不确定这是否是正确的方法。为什么TabLayout不会自动反映对ViewPager(新片段)的更改?

2 个答案:

答案 0 :(得分:1)

您的解决方案非常简单,但还需要一件事。如果您可以看到TabLayoutOnPageChangeListener的方法,它还 setupWithViewPager()添加到viewPager,因此每当您调用viewPager.clearOnPageChangeListeners()时,您都会再添加一个侦听器。在致电setupWithViewPager()之前,您应该致电notifyDataSetChanged()删除旧的lisetner,这样就可以了。

在项目中,我正在使用,我们使用的是一个不同的解决方案,但这是因为使用了一些特定行为的自定义选项卡视图: 您可以在viewpageradapter上注册registerDataSetserver。每当您拨打DataSetObserver.onChanged()时,您的rails new <appname> gem uninstall bundler gem install bundler -v 1.9 cd <appname> bundle install 也会被呼叫。在这个方法中,我们使用tablayout中的选项卡进行操作(创建新的/删除旧的)。我们还为tabLayout创建了新的onTabSelectedListeners。

答案 1 :(得分:0)

您需要按照上面的建议添加观察者。在this.viewPager和this.tabLayout使用的this.mAdapter中为新添加的项添加一个新选项卡。

       mAdapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            if (tabLayout.getTabCount() < mAdapter.getCount()) {
                tabLayout.addTab(tabLayout.newTab().setText(mAdapter.getPageTitle(mAdapter.getCount() - 1)), mAdapter.getCount() - 1);
            }
        }
    });