简体   繁体   English

Android支持设计库中的TabLayout中的IndexOutOfBoundsException

[英]IndexOutOfBoundsException in TabLayout in android support design lib

I use android.support.design in all my projects, and today I updated it to latest version 我在所有项目中都使用android.support.design ,今天我将其更新为最新版本

com.android.support:design:22.2.1 com.android.support:design:22.2.1

It was a bad idea, because my project crashed with 这是一个坏主意,因为我的项目崩溃了

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)

After some debugging, I found a problem in this method: 经过一些调试后,我发现此方法存在问题:

 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 
        }

    }
}

But in previous version 22.2.0 of lib, all was working fine: 但是在lib的先前版本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));
    }
}

Who did it and who can be punished for it? 是谁做的,谁可以为此受惩罚?

Please help me find developers for Android support Design library. 请帮助我找到Android支持设计库的开发人员。

My guess is that your problem is due to: 我的猜测是您的问题是由于:

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

Apparently, TabLayout does not like empty adapters. 显然, TabLayout不喜欢空适配器。 This does not surprise me. 这并不令我惊讶。

So, do not call setupWithViewPager() right away. 因此,请勿立即调用setupWithViewPager() When you do eventually update your PagerAdapter to return a non-zero value from getCount() , you can call setupWithViewPager() . 当您最终将PagerAdapter更新为从getCount()返回非零值时,可以调用setupWithViewPager() Second and subsequent times you change the PagerAdapter , after calling notifyDataSetChanged() on the adapter, call setTabsFromPagerAdapter() to refresh the tabs to align with the PagerAdapter contents. 第二次及以后,更改PagerAdapter ,在适配器上调用notifyDataSetChanged()之后,调用setTabsFromPagerAdapter()刷新选项卡以使其与PagerAdapter内容对齐。 You can use a boolean to track whether you need to call setupWithViewPager() or setTabsFromPagerAdapter() . 您可以使用boolean来跟踪是否需要调用setupWithViewPager()setTabsFromPagerAdapter()

You are certainly welcome to file a feature request for TabLayout to support empty adapters. 当然,欢迎您提出针对TabLayout 的功能请求 ,以支持空适配器。

I'd love to just comment with this, but I don't have the reputation. 我很想对此发表评论,但我没有声誉。

It looks like this issue is being tracked and pegged for a fix in a future release: https://code.google.com/p/android/issues/detail?id=180453 似乎正在跟踪此问题并将其固定在将来的版本中,以寻求修复: https : //code.google.com/p/android/issues/detail?id=180453

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM