ArrayIndexOutOfBoundsException con Adaptador Android personalizado para varias vistas en ListView
Estoy intentando crear un adaptador de encargo para mi ListView puesto que cada artículo en la lista puede tener una diversa visión (un acoplamiento, un interruptor, o un grupo de radio), pero cuando intento funcionar la actividad que utiliza el ListView recibo un error y La aplicación se detiene. La aplicación está dirigida a la plataforma Android 1.6.
El código:
- Estilo de ListView de Android
- Android: ¿Cómo puedo comprobar un elemento en particular en CheckView ListView?
- Problema de fondo de ListView personalizado
- Cómo cambiar la altura del divisor de listview dinámicamente?
- Lista de desplazamiento horizontal de Android
public class MenuListAdapter extends BaseAdapter { private static final String LOG_KEY = MenuListAdapter.class.getSimpleName(); protected List<MenuItem> list; protected Context ctx; protected LayoutInflater inflater; public MenuListAdapter(Context context, List<MenuItem> objects) { this.list = objects; this.ctx = context; this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent); MenuItem item = list.get(position); Log.i(LOG_KEY, "Item=" + item ); if (convertView == null) { convertView = this.inflater.inflate(item.getLayout(), null); } return convertView; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEnabled(int position) { return true; } @Override public int getCount() { return this.list.size(); } @Override public MenuItem getItem(int position) { return this.list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { Log.i(LOG_KEY, "getItemViewType: " + this.list.get(position).getLayout()); return this.list.get(position).getLayout(); } @Override public int getViewTypeCount() { Log.i(LOG_KEY, "getViewTypeCount: " + this.list.size()); return this.list.size(); } }
El error que recibo:
java.lang.ArrayIndexOutOfBoundsException at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523) at android.widget.ListView.measureHeightOfChildren(ListView.java:1158) at android.widget.ListView.onMeasure(ListView.java:1060) at android.view.View.measure(View.java:7703)
Sé que la aplicación está volviendo de getView
y todo parece en orden.
Cualquier idea sobre lo que podría estar causando esto sería apreciada.
Gracias,
Decano
- ¿Se desvanece en la parte inferior de una lista desplazable en Android?
- Función de parada que llama en pestañas
- ViewHolders para ListViews con diferentes diseños de elementos
- Reciclar mapas de bits en un listview causa problemas
- Cambiar las teclas de función de fondo de negro a transparente en la aplicación android
- Problema al usar una fuente personalizada - "no se puede hacer el tipo de letra nativo"
- ¿Cómo puedo configurar una fuente personalizada en mi listview?
- Android: establece el elemento de vista de lista como "seleccionado" (resaltado)
El tipo de vista de artículo que está regresando de
getItemViewType()
es >= getViewTypeCount()
.
La respuesta aceptada es correcta. Esto es lo que estoy haciendo para evitar el problema:
public enum FoodRowType { ONLY_ELEM, FIRST_ELEM, MID_ELEM, LAST_ELEM } @Override public int getViewTypeCount() { return FoodRowType.values().length; } @Override public int getItemViewType(int position) { return rows.get(position).getViewType(); //returns one of the above types }
La razón, es más probable porque el método getItemViewType está devolviendo los valores equivocados! Cada fila en listview es una vista. Mientras que el scrooling getItemViewType alcanza más que el recuento de View.
¿Qué hacer? ¿Cómo evitar el problema?
Primero determine view (row) en su listview que se muestra primero. Mientras Scrolling usa la ecuación moduler
@Override public int getItemViewType(int position) { return choseType(position);//function to use modular equation } @Override public int getViewTypeCount() { return 10; }
En este ejemplo hay diez view (10 row).
private int choseType(int position){ if(position%10==0) return 0; else if(position%10==1) return 1; else if(position%10==2) return 2; else if(position%10==3) return 3; else if(position%10==4) return 4; else if(position%10==5) return 5; else if(position%10==6) return 6; else if(position%10==7) return 7; else if(position%10==8) return 8; else return 9; }
Importante
Algunos usuarios mencionaron en otra pregunta sobre stackoverflow ese método
Public int getViewTypeCount () y public int getItemViewType (int position) arreglar como Tooglebutton activar automáticamente el estado check true en scrooling .. que es un error grande . Si usted no quiere automática enbale en scrool sólo hacer
toogleButton.setChecked(false);
En el método getView override.
- ¿La mejor manera de agregar actividad a un proyecto de Android en Eclipse?
- Disposición de Android que reemplaza una vista con otra vista en tiempo de ejecución