Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


IndexOutOfBoundsException en TabLayout en la librería de diseño de soporte de android

Uso android.support.design en todos mis proyectos, y hoy lo he actualizado a la última versión

Com.android.support:design:22.2.1

Fue una mala idea, porque mi proyecto se estrelló con

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) 

Después de algunos depuración, encontré un problema en este método:

  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 } } } 

Pero en la versión anterior 22.2.0 de lib, todo funcionaba bien:

  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)); } } 

¿Quién lo hizo y quién puede ser castigado por ello?

Por favor, ayúdame a encontrar desarrolladores para Android.

  • Error en la sincronización del proyecto de Android Gradle
  • ¿Cuál es el propósito de un patrón de delegación?
  • Android: Pasar datos (extras) a un fragmento
  • Javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Ancla de confianza para la ruta de certificación no encontrada
  • No se puede degradar la base de datos de la versión 2 a 1 incluso después de una nueva instalación y volver a ejecutar
  • ¿Por qué no funciona mi servicio en Android? (Sólo quiero registrar algo nunca 5 segundos)
  • Captura todas las excepciones de tipo de programación de Android
  • ¿Cómo calcular la posición en un círculo con un cierto ángulo?
  • 2 Solutions collect form web for “IndexOutOfBoundsException en TabLayout en la librería de diseño de soporte de android”

    Me encantaría comentar con esto, pero no tengo la reputación.

    Parece que este problema se está realizando un seguimiento y un seguimiento de una corrección en una versión futura: https://code.google.com/p/android/issues/detail?id=180453

    Mi conjetura es que su problema se debe a:

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

    Al parecer, TabLayout no le gusta los adaptadores vacíos. Esto no me sorprende.

    Por lo tanto, no llame a setupWithViewPager() inmediato. Cuando finalmente actualiza su PagerAdapter para devolver un valor distinto de cero de getCount() , puede llamar a setupWithViewPager() . La segunda y las veces siguientes cambia el PagerAdapter , después de llamar a notifyDataSetChanged() en el adaptador, llame a setTabsFromPagerAdapter() para actualizar las fichas para alinearlas con el contenido de PagerAdapter . Puede utilizar un boolean para realizar un seguimiento si necesita llamar a setupWithViewPager() o setTabsFromPagerAdapter() .

    Sin duda, puede presentar una solicitud de función para TabLayout para admitir adaptadores vacíos.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.