在安卓支持设计库的TabLayout中发生了IndexOutOfBoundsException异常

8

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

com.android.support:design: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中,所有内容都能正常运行:

    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支持设计库的开发者。


从我看到的情况来看,我感觉 viewPager.getCurrentItem() 不是 零索引,而方法 getTabAt() 却期望它是。请检查API,尝试使用 this.getTabAt(viewPager.getCurrentItem() - 1).select(); - Sudhansu Choudhary
@SudhansuChoudhary:ViewPager上的getCurrentItem()是从零开始计数的。 - CommonsWare
2个回答

3

我的猜测是你的问题是由于:

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

显然,TabLayout 不喜欢空适配器。这并不让我感到惊讶。
因此,请勿立即调用 setupWithViewPager()。当您最终更新 PagerAdapter 以从 getCount() 返回非零值时,可以调用 setupWithViewPager()。在调用 notifyDataSetChanged() 更新适配器后更改 PagerAdapter 的第二次及随后的更改,请调用 setTabsFromPagerAdapter() 以刷新选项卡以与 PagerAdapter 内容对齐。您可以使用一个布尔值来跟踪是否需要调用 setupWithViewPager()setTabsFromPagerAdapter()
您当然可以提交功能请求,以支持空适配器的 TabLayout

这个答案很棒,很有道理,而且确实解决了问题。我很惊讶另一个本应该被删除的答案竟然被接受了。 - Iharob Al Asimi

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接