with studio dinamico con botones android exception listview adapter

studio - ArrayIndexOutOfBoundsException con un adaptador de Android personalizado para mĂșltiples vistas en ListView



listview dinamico android studio (4)

Estoy intentando crear un Adaptador personalizado para mi ListView, ya que cada elemento de la lista puede tener una vista diferente (un enlace, un alternar o un grupo de radio), pero cuando intento ejecutar la Actividad que usa 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 estar en orden.

Cualquier idea sobre lo que podría estar causando esto sería apreciada.

Gracias,

-Dan


El problema surge cuando el valor de getItemType es incorrecto. Este valor debe ser un entero y debe ser de 0 a getViewTypeCount () - 1.


El tipo de vista de elemento desde el que regresas

getItemViewType() es >= getViewTypeCount() .


La razón es muy probable porque el método getItemViewType está devolviendo los valores incorrectos. Cada fila en la vista de lista es una Vista. Mientras scrooling getItemViewType alcanza más que el conteo de View.

¿Qué hacer? ¿Cómo evitar el problema?

Primero determine la vista (fila) en su vista de lista que se muestra primero. Mientras se desplaza utiliza la ecuación de modulador

@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 vistas (10 filas).

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 ese método

public int getViewTypeCount () y public int getItemViewType (int position) fix como Tooglebutton habilita automáticamente state check true en scrooling ... eso está muy mal . Si no quieres enbale automático en scrool solo hazlo

toogleButton.setChecked(false);

en el método de anulación getView.


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 }