Nicht verwenden LayoutInflater in benutzerdefinierten adapter
Ich bin auf der Suche in dem schreiben eines benutzerdefinierten adapter zum füllen eines listview mit 3 textviews pro Zeile. Die ich gefunden habe schon ein bisschen Beispiel-code, um dies zu tun, aber der eine schien der beste war: http://www.anddev.org/custom_widget_adapters-t1796.html
Nach ein paar kleinere änderungen beheben einige compiler Probleme mit der neuesten Android-SDK, ich habe es ausgeführt, nur um die Ausnahme:
ERROR/AndroidRuntime(281): java.lang.UnsupportedOperationException: addView(View, LayoutParams) wird nicht unterstützt, in AdapterView
So, ich habe eine Menge Forschung und fand viele mögliche Ursachen und fixes für diese. Von denen keine eine Sache verändert. Mein adapter code ist aktuell:
public class WeatherAdapter extends BaseAdapter {
private Context context;
private List<Weather> weatherList;
public WeatherAdapter(Context context, int rowResID,
List<Weather> weatherList ) {
this.context = context;
this.weatherList = weatherList;
}
public int getCount() {
return weatherList.size();
}
public Object getItem(int position) {
return weatherList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
Weather weather = weatherList.get(position);
//LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.weather_row, null, true);
TextView cityControl = (TextView)v.findViewById( R.id.city );
TextView temperatureControl = (TextView)v.findViewById( R.id.temperature );
ImageView skyControl = (ImageView)v.findViewById( R.id.sky );
return v;
}
}
So, ich habe versucht die auskommentiert Weg, den inflater, und die derzeit unkommentiert aus. Ich habe versucht vorbei "Eltern" zum aufblasen als auch null, und der übergabe von "true", "false" weglassen und komplett der Letzte parameter. Keiner von Ihnen gearbeitet haben, und alle Beispiele die ich bisher gefunden habe waren von 2008, in denen ich das Gefühl sind ein bisschen veraltet.
Wenn jemand helfen könnte mit diesem dann würde ich gerne das Problem zu beheben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein Anfänger auch also nimm diese Antwort mit einer Prise Salz, wenn es nicht funktioniert, verschieben Sie auf Google und einige mehr. Nicht vertraut mit
AdapterView
da ich traditionell einenListView
oderGridView
und eine benutzerdefinierte Adapter-extended aus einerBaseAdapter
und dannlistView.setAdapter(myCustomAdapter)
.Könnten Sie versuchen, dass so etwas wie dies innerhalb der
WeatherAdapter
Klasse:Dann in die Klasse, ruft
WeatherAdapter
:Werden Sie brauchen, es zu optimieren, mehr in der getView-Methode:
http://www.youtube.com/watch?v=wDBM6wVEO70
Ich glaube, diese Zeile ist Schuld:
Müssen Sie stattdessen:
Den falschen macht der inflationäre Sicht unabhängig von der übergeordneten, nicht an, welche sehr merkwürdig zu sein scheint, die akzeptierte design für benutzerdefinierte Ansichten in
AdapterView
s. Warum dies so ist, finde ich völlig unverständlich, aber das Muster oben für mich gearbeitet.AdapterView
Sie möchten, dass Ihre Ansichten unabhängig zu sein von der Muttergesellschaft, dergetView()
kümmert sich um die Anbringung an die Eltern für Sie.getView()
kümmert es seit Sie werden die einen schreiben, würd ich eher sagen, was ruftgetView()
(in anderen Worten, der Rahmen), kümmert sich um das anbringen der Ansicht zurückgegebengetView()
.Für die
AdaptertView addView
Methode:Wahrscheinlich das aufblasen-Prozedur ruft die
addView
Methode und dieses ist nicht möglich aus einemAdapterView
oder seineAdapterView
.Aus der Dokumentation:
Ich denke, dass das aufblasen Betrieb getan werden könnte, von einer einfachen Aktivität, die Modelle Ihr Blick und alle andere Operationen, zum Beispiel das abrufen von Daten und Darstellung von Daten in anderen Klassen.
Hoffe, es wird hilfreich sein!
@Axel22 die Antwort ist der Schlüssel, aber es gibt ein paar andere Dinge, die fehlen aus dem code. Zunächst sollten Sie die Erweiterung entweder BaseAdapter oder ArrayAdapter, je nach Vorliebe. Zweitens, Sie wollen in die Praxis, ein ViewHolder zu verhindern, dass übermäßige Anrufe zu findViewById und (am wichtigsten) recycling Ihrer Ansicht.
Ihre getView-Funktion können recyceln Aussicht und nutzen Sie die
ViewHolder
- Klasse wie folgt:}
Für Tonnen mehr Beispiele (und anderen Optimierungs-Tipps) finden Sie unter in diesem blog-post (oder einfach nur google für ViewHolder).