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

Je tente de créer un adaptateur personnalisé pour mon 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 Ssortingng LOG_KEY = MenuListAdapter.class.getSimpleName(); protected List list; protected Context ctx; protected LayoutInflater inflater; public MenuListAdapter(Context context, List 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 que tout semble en ordre.

Toutes les idées sur ce qui pourrait causer cela seraient appréciées.

Merci,

-Dan

Le type de vue d’article que vous retournez

getItemViewType() est >= getViewTypeCount() .

La réponse acceptée est correcte. C’est 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 de getItemType est incorrecte. Cette valeur doit être un entier et doit être comprise entre 0 et getViewTypeCount () – 1.

La raison en est probablement que la méthode getItemViewType renvoie des valeurs incorrectes! Chaque ligne de listview est une vue unique. Lorsque scrooling getItemViewType atteint plus que le nombre de View.

Que faire? Comment éviter le problème?

Déterminez d’abord la vue (ligne) dans votre listview qui est affichée en premier.

  @Override public int getItemViewType(int position) { return choseType(position);//function to use modular equation } @Override public int getViewTypeCount() { return 10; } 

Dans cet exemple, il y a dix vues (10 lignes).

 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; } 

Important

Certains utilisateurs ont mentionné sur une autre question sur stackoverflow cette méthode

public int getViewTypeCount () et public int getItemViewType (int position) Correction comme si Tooglebutton activait automatiquement la vérification de l’état true lors du scrooling .. ce qui ne va pas .

 toogleButton.setChecked(false); 

sur la méthode de remplacement getView.