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:

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

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.

  • Otro parámetro java.lang.IllegalArgumentException: debe ser un descendiente de esta vista
  • ListView desplazamiento de fondo con datos
  • El fondo seleccionado de la vista de lista de Android no funciona en 2.3
  • El fondo Listview es gris en Droid 3
  • Convertir elementos de vista de lista en una sola imagen de mapa de bits
  • El selector de Android para el elemento seleccionado no funciona
  • Resaltar texto buscado en elementos ListView
  • Setvisibility (view.visible) no funciona después de setvisibility (view.gone)
  • ¿Lista de múltiples opciones con vista personalizada?
  • ¿Cómo diferenciar entre un fling y un toque?
  • AutoLink con evento onClick
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.