android 支持设计库中 TabLayout 中的 IndexOutOfBoundsException

IndexOutOfBoundsException in TabLayout in android support design lib

我所有的项目都用android.support.design,今天更新到最新版本

com.android.support:设计:22.2.1

这是个坏主意,因为我的项目因

而崩溃
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
java.util.ArrayList.get(ArrayList.java:308)
android.support.design.widget.TabLayout.getTabAt(TabLayout.java:407)
android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:585)

经过一番调试,发现这个方法有问题:

 public void setupWithViewPager(@NonNull ViewPager viewPager) {
    PagerAdapter adapter = viewPager.getAdapter();
    if(adapter == null) {
        throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
    } else {
        this.setTabsFromPagerAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(this));
        this.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
        if(this.mSelectedTab == null || this.mSelectedTab.getPosition() != viewPager.getCurrentItem()) {
            this.getTabAt(viewPager.getCurrentItem()).select();// ERROR On my code I'm used empty adapter 
        }

    }
}

但在以前的 22.2.0 版本的 lib 中,一切正常:

    public void setupWithViewPager(ViewPager viewPager) {
    PagerAdapter adapter = viewPager.getAdapter();
    if(adapter == null) {
        throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
    } else {
        this.setTabsFromPagerAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(this));
        this.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
    }
}

谁干的,谁会受到惩罚?

请帮我寻找 Android 支持设计库的开发人员。

我猜你的问题是由于:

// ERROR On my code I'm used empty adapter

显然,TabLayout 不喜欢空适配器。这并不让我吃惊。

所以,不要马上打电话给 setupWithViewPager()。当您最终将 PagerAdapter 更新为 return 来自 getCount() 的非零值时,您可以调用 setupWithViewPager()。第二次及以后更改 PagerAdapter 时,在适配器上调用 notifyDataSetChanged() 后,调用 setTabsFromPagerAdapter() 刷新选项卡以与 PagerAdapter 内容对齐。您可以使用 boolean 来跟踪是否需要调用 setupWithViewPager()setTabsFromPagerAdapter().

当然欢迎您使用 file a feature requestTabLayout 支持空适配器。

我很想对此发表评论,但我没有名气。

看起来这个问题正在被跟踪并在未来的版本中修复:https://code.google.com/p/android/issues/detail?id=180453