viewpager studio que practice pagetransformer pageradapter fragments best android android-viewpager

studio - viewpager slider in android



Android ViewPager lanza la excepción IndexOutOfBounds al configurar el elemento/página actual (2)

Tengo un ViewPager con tres elementos. Estoy tratando de configurar el ViewPager para ver la página más a la derecha (que sería el segundo elemento). Esto está devolviendo una excepción IndexOutOfBounds, aunque sé que el índice debería estar dentro de los límites. Aquí está la pila exacta:

02-22 12:22:50.256: E/AndroidRuntime(384): FATAL EXCEPTION: main 02-22 12:22:50.256: E/AndroidRuntime(384): java.lang.IndexOutOfBoundsException: index=1 count=0 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addInArray(ViewGroup.java:2050) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInner(ViewGroup.java:1994) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1958) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1939) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addView(ViewPager.java:917) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addView(ViewGroup.java:1828) 02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiateItem(MasterActivity.java:518) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.populate(ViewPager.java:783) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Handler.dispatchMessage(Handler.java:99) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Looper.loop(Looper.java:123) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.app.ActivityThread.main(ActivityThread.java:3683) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invokeNative(Native Method) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invoke(Method.java:507) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-22 12:22:50.256: E/AndroidRuntime(384): at dalvik.system.NativeStart.main(Native Method)

Tenga en cuenta que la causa es java.lang.IndexOutOfBoundsException: index=1 count=0 . Esto implicaría que el recuento de las páginas / elementos es 0 y el índice que solicito es 1. Ninguna de estas cosas es cierta. Aquí es cómo estoy llamando a mi ViewPager y solicitando la página dada:

ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(2);

Tenga en cuenta que esta llamada no genera ningún error y establece correctamente el elemento actual en el elemento central (índice 1):

ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(1);

Tengo un recuento de 3 artículos en el visor de páginas. Aquí está mi clase completa de PAdapter, que extiende la clase de PagerAdapter:

private class PAdapter extends PagerAdapter implements TitleProvider { private int COUNT = 3; private static final int SETTINGS_ACTIVITY = 0; private static final int MAIN_ACTIVITY = 1; private static final int FRIEND_LIST_ACTIVITY = 2; @Override public int getCount() { return COUNT; } @Override public Object instantiateItem(View collection, int position) { LinearLayout layout = new LinearLayout(getApplicationContext()); LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); switch(position) { case MAIN_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.main, null, false); initMainLayout(layout); break; case SETTINGS_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.settings, null, false); initSettingsLayout(layout); break; case FRIEND_LIST_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.friend_list, null, false); initFriendListLayout(layout); break; } ((ViewPager)collection).addView(layout, position); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager)collection).removeView((LinearLayout)view); } @Override public boolean isViewFromObject(View v, Object o) { return v == (LinearLayout)o; } @Override public void finishUpdate(View arg0) { //no need } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //no need } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { //no need } @Override public String getTitle(int position) { Resources res = getApplicationContext().getResources(); switch(position) { case MAIN_ACTIVITY : return res.getString(R.string.app_name); case SETTINGS_ACTIVITY : return res.getString(R.string.settings); case FRIEND_LIST_ACTIVITY : return res.getString(R.string.friend_list); default : return null; } } }

La línea ((ViewPager)collection).addView(layout, position); causa el accidente.

Como puedes ver, tres artículos. El uso de setCurrentItem () con un parámetro de 0 o 1 funciona bien, pero 2 causa este error extraño. Me he quedado sin ideas para resolverlo ... desafortunadamente, ViewPager reside en algunas aguas inexploradas de Android, parece. Si alguien tiene alguna idea sobre cómo resolver esto, sería muy apreciado. ¡Gracias!

EDITAR: De acuerdo con la sugerencia de Shereef, intenté registrar el recuento de niños a través de collection.getChildCount () y obtuve el siguiente resultado:

02-22 15:20:42.274: E/children count(645): count: 0 02-22 15:20:42.454: E/children count(645): count: 1 02-22 15:20:42.594: E/children count(645): count: 2

Esto es interesante. Lo que esto me dice es que está creando un PagerAdapter vacío y agregándolos uno a la vez. instantiateItem() se llama 3 veces para las tres vistas visibles (centro, izquierda y derecha). Así que agregué este bloque de código dentro del método instantiateItem() :

if(((ViewPager)collection).getChildCount() == 2) { ((ViewPager)collection).setCurrentItem(2); }

Así que solo si se establece que el recuento es 2, se configurará la página en 2 (esta es una solución intrépida que no resuelve el problema por completo, pero que valió la pena intentarlo). ((ViewPager)collection).setCurrentItem(2); una pila de errores similar que apuntaba primero a la línea: ((ViewPager)collection).setCurrentItem(2); , luego ((ViewPager)collection).addView(layout, position); .

Espero que esto ayude a dar una idea.


No creo que solo puedas hacer ((ViewPager)collection).addView(layout, position) . Depende de su límite de páginas fuera de la pantalla, que por defecto es 1, creo. Supongo que solo estás usando 3 vistas, por lo que puedes hacer algo como viewPager.setOffscreenPageLimit(3); en su `onCreate (o donde sea que haya realizado su llamada) para evitar que cada vista se actualice cada vez que la abandone.

Verá en algunos tutoriales esa ((ViewPager) collection).addView(view, 0); se utiliza en instantiateItem() . He trabajado bastante con ViewPagers en las últimas semanas, y usando 0 como la posición -todo- el tiempo parece funcionar bien.


Veo el registro de bloqueo, veo que se bloquea en el elemento de instanciación. No sé qué línea exactamente porque no tengo sus números de línea

Pero si fuera un apostador, apostaría a que:

((ViewPager)collection).addView(layout, position);

Se bloquea al intentar agregar la vista en la posición 1 mientras no hay páginas en la colección. Tal vez verifique la collection.getchildcount() (tal vez el nombre del método sea incorrecto) e insértelo al máximo (posición, cuenta)

es decir, reemplazar la posición con:

count > position ? position : count

EDITAR:

((ViewPager)collection).addView(layout, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount())

ps Publicando desde mi teléfono lo siento por el horrible formato

Note por favor

02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiat MasterActivity.java:518

El número al final de la línea que copié y averigüe qué línea es, y solo entonces sabrá qué línea se estrelló

EDIT: PS acerca de su solución

Creo que su solución solo establece el elemento actual después de que las 3 páginas hayan sido instanciadas por el elemento instanciado, pero mi línea lo haría funcionar incluso si no se crearan una instancia.