【问题标题】:IndexOutOfBoundsException in TabLayout in android support design libandroid 支持设计库中 TabLayout 中的 IndexOutOfBoundsException
【发布时间】:2015-08-06 17:36:01
【问题描述】:

我在所有项目中都使用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 版本的 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 支持设计库的开发人员。

【问题讨论】:

  • 据我所见,我觉得viewPager.getCurrentItem() 不是零索引 方法,getTabAt() 期望它是。检查API,试试this.getTabAt(viewPager.getCurrentItem() - 1).select();
  • @SudhansuChoudhary: getCurrentItem() on ViewPager 是从零开始的。

标签: java android android-support-design


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这个答案很好,很有意义并且确实解决了问题。我很惊讶实际上应该删除的另一个被接受了。
【解决方案2】:

我很想对此发表评论,但我没有声誉。

似乎正在跟踪此问题并在未来的版本中进行修复:https://code.google.com/p/android/issues/detail?id=180453

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 2023-03-04
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多