ViewPager vacío se bloquea con PagerTabStrip

Cuando se utiliza ViewPager con PagerTabStrip :

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent"> <android.support.v4.view.PagerTabStrip android:id="@+id/pager_tab_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingTop="4dp" android:paddingBottom="4dp" /> </android.support.v4.view.ViewPager> 

Con paginador que tiene un adaptador vacío:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewPager pager = (ViewPager) findViewById(R.id.pager); FragmentPagerAdapter adapter = new FragmentPagerAdapter(getFragmentManager()) { @Override public CharSequence getPageTitle(int position) { return "test"; } @Override public Fragment getItem(int i) { return null; } @Override public int getCount() { return 0; } }; pager.setAdapter(adapter); } 

La aplicación se bloquea al tocar / desplazar la barra de pestañas:

 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) at java.util.ArrayList.get(ArrayList.java:304) at android.support.v4.view.ViewPager.performDrag(ViewPager.java:1990) 

Creo que esta línea en ViewPager.performDrag() podría ser la causa.

¿Es un error o algo malo con mi configuración de vista?

En ViewPager se accede a los elementos de la matriz de código sin ninguna comprobación (cuando no hay ninguna página):

 final ItemInfo firstItem = mItems.get(0); final ItemInfo lastItem = mItems.get(mItems.size() - 1); 

Esto hace que se bloquee.

Este error aún no está fijo, ya que encontré el mismo problema. El problema son estas dos líneas en la clase ViewPager de Android, en el método performDrag (float x):

 final ItemInfo firstItem = mItems.get(0); final ItemInfo lastItem = mItems.get(mItems.size() - 1); 

No hay cheques en absoluto, si el artilugio de mItems está vacío o no. Esto no debería ser difícil de solucionar para el equipo de Android …

Sin embargo, vine con una solución rápida y sucia que no sugeriría usar. Simplemente haga su propia clase extendiendo ViewPager y anule el método, que produce el fallo y lo rodea con un bloque try, catch:

 public class CustomViewPager extends ViewPager { public CustomViewPager(Context context) { super(context); } public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean event = false; try { event = super.onInterceptTouchEvent(ev); } catch (Exception e) { Log.e(MainActivity.TAG, "ERROR: ViewPagerAdapter was empty"); } return event; } } 

Es una mala práctica usar try, catch blocks para la lógica del programa, pero hasta que el equipo de android corrija este bug, esta es la única solución que funcionó para mí.

EDITAR:

No olvide hacer referencia a su ViewPager personalizado en el XML:

 <com.package.CustomViewPager android:id="@+id/viewPager_fragment_container" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v4.view.PagerTabStrip android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.package.CustomViewPager> 
  • En un android ListView, ¿cómo puedo iterar / manipular todas las vistas de los niños, no sólo los visibles?
  • ¿Dónde defino mi OnClickListener para cerrar una vista de diálogo personalizada en Android?
  • AppWidgetProvider: onAppWidgetOptionsChanged no se llama en la ubicación del widget
  • Android AppWidget no se muestra en ciertos teléfonos
  • Ejemplo de un elemento spinner personalizado setDropDownViewResource
  • Android ListView con desplazamiento rápido y el índice de la sección alfabética
  • Android - Personalización del widget Spinner Look and Feel
  • Documentación del widget de la pantalla principal de Android
  • Controle el tiempo de ejecución de la visibilidad de Android TextView mediante programación
  • Cómo hacer widget de la aplicación en ejecución en android?
  • Gen ya existe pero no es una carpeta de origen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.