J'essaie de créer un adaptateur personnalisé pour ma ListView car chaque élément de la liste peut avoir une vue différente (un lien, une bascule ou un groupe de radio), mais lorsque j'essaie d'exécuter l'activité qui utilise ListView, je reçois une erreur et l'application s'arrête. L'application est destinée à la plate-forme Android 1.6.
Le code:
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();
}
}
L'erreur que je reçois:
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)
Je sais que l'application revient de getView
et tout semble en ordre.
Toutes les idées sur ce qui pourrait être à l'origine de cela seraient appréciées.
Merci,
-Dan
Le type de vue d'élément dont vous retournez
getItemViewType()
est >= getViewTypeCount()
.
La réponse acceptée est correcte. Voici ce que je fais pour éviter le problème:
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
}
Le problème survient lorsque la valeur getItemType est incorrecte. Cette valeur doit être un entier et doit être comprise entre 0 et getViewTypeCount () - 1.