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 getView
et que tout semble en ordre.
Toute idée sur ce qui pourrait en être la cause serait appréciée.
Merci,
-Dan
Réponses:
Le type de vue d'élément dont vous retournez
getItemViewType()
est>= getViewTypeCount()
.la source
La réponse acceptée est correcte. Voici ce que je fais pour éviter le problème:
la source
getItemViewType
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 source
La raison est probablement parce que la méthode getItemViewType renvoie les mauvaises valeurs! Chaque ligne de la liste est une vue unique. Lors du balayage, getItemViewType atteint plus que le nombre de View.
Que faire? Comment éviter les problèmes?
Déterminez d'abord la vue (ligne) de votre liste qui s'affiche en premier. Pendant le défilement, utilisez l'équation du modulateur
Dans cet exemple, il y a dix vues (10 lignes).
Important
Certains utilisateurs ont mentionné sur une autre question sur stackoverflow cette méthode
sur la méthode de remplacement getView.
la source