web-dev-qa-db-fra.com

ArrayIndexOutOfBoundsException avec un adaptateur personnalisé Android pour plusieurs vues dans ListView

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

185
Dan

Le type de vue d'élément dont vous retournez

getItemViewType() est >= getViewTypeCount().

512
Romain Guy

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
}
17
mtbomb

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.

0
sunil jain