Ich versuche, einen benutzerdefinierten Adapter für meine ListView zu erstellen, da jedes Element in der Liste eine andere Ansicht haben kann (ein Link, ein Umschalter oder eine Funkgruppe). Wenn ich jedoch versuche, die Aktivität auszuführen, die die ListView verwendet, wird eine Fehlermeldung angezeigt Die App stoppt. Die Anwendung ist für die Android 1.6-Plattform vorgesehen.
Der 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();
}
}
Der Fehler, den ich erhalte:
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)
Ich weiß, dass die Anwendung zurückkommt getView
und alles in Ordnung zu sein scheint.
Irgendwelche Ideen, was dies verursachen könnte, wären willkommen.
Vielen Dank,
-Dan
Antworten:
Der Elementansichtstyp, von dem Sie zurückkehren
getItemViewType()
ist>= getViewTypeCount()
.quelle
Die akzeptierte Antwort ist richtig. Dies ist, was ich tue, um das Problem zu vermeiden:
quelle
getItemViewType
nicht intDas Problem tritt auf, wenn der Wert für getItemType falsch ist. Dieser Wert sollte eine Ganzzahl sein und von 0 bis getViewTypeCount () - 1 reichen.
quelle
Der Grund ist höchstwahrscheinlich, dass die Methode getItemViewType die falschen Werte zurückgibt! Jede Zeile in der Listenansicht ist eine Einzelansicht. Beim Scrooling erreicht getItemViewType mehr als die Anzahl von View.
Was ist zu tun? Wie vermeide ich Probleme?
Bestimmen Sie zuerst die Ansicht (Zeile) in Ihrer Listenansicht, die zuerst angezeigt wird. Verwenden Sie beim Scrollen die Moduler-Gleichung
In diesem Beispiel gibt es zehn Ansichten (10 Zeilen).
Wichtig
Einige Benutzer haben in einer anderen Frage zum Stackoverflow diese Methode erwähnt
auf getView überschreiben Methode.
quelle