Estoy intentando crear un Adaptador personalizado para mi ListView, ya que cada elemento de la lista puede tener una vista diferente (un enlace, alternar o 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á regresando getView
y todo parece estar en orden.
Cualquier idea sobre lo que podría estar causando esto sería apreciada.
Gracias,
-Dan
Respuestas:
El tipo de vista del elemento desde el que regresa
getItemViewType()
es>= getViewTypeCount()
.fuente
La respuesta aceptada es correcta. Esto es lo que estoy haciendo para evitar el problema:
fuente
getItemViewType
no volviera intEl problema surge cuando el valor de getItemType es incorrecto. Este valor debe ser un entero y debe ser de 0 para getViewTypeCount () - 1.
fuente
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 explora getItemViewType alcanza más que el recuento de vistas.
¿Qué hacer? ¿Cómo evitar problemas?
Primero determine la vista (fila) en su vista de lista que se muestra primero. Mientras se desplaza use la ecuación del modulador
En este ejemplo, hay diez vistas (10 filas).
Importante
Algunos usuarios mencionaron en otra pregunta sobre stackoverflow ese método
en el método de anulación getView.
fuente