Unfähig LayoutInflater in benutzerdefinierten Adapter zu verwenden
-
29-09-2019 - |
Frage
Ich suche in das Schreiben eines benutzerdefinierten Adapter eine Listenansicht mit 3 Textviews pro Zeile zu füllen. Ich habe ziemlich viel Beispielcode gefunden, dies zu tun, aber derjenige, der das beste schien, war unter:
Lösung Ich bin ein Anfänger auch nehmen, um diese Antwort mit einer Prise Salz -, wenn es nicht funktioniert, bewegen sich auf und Google ein paar mehr. Nicht vertraut mit Sie könnten versuchen, so etwas wie dies in der Dann in der Klasse, die Anrufe Darüber hinaus müssen Sie es in der getView Methode zur Optimierung: AdapterView
da ich traditionell ListView
oder GridView
und einem benutzerdefinierten Adapter ein BaseAdapter
erweitert ab und dann listView.setAdapter(myCustomAdapter)
. WeatherAdapter
Klasse machen: public void addToList(Weather mWeather) {
weatherList.add(mWeather);
}
WeatherAdapter
: weatherAdapter.addToList(weatherToAdd);
weatherAdapter.notifyDataSetChanged();
Andere Tipps
Ich glaube, diese Linie bei Störung ist:
View v = inflater.inflate(R.layout.weather_row, null, true);
Sie müssen stattdessen:
View v = inflater.inflate(R.layout.weather_row, parent, false);
Die falsche macht die aufgeblasene Ansicht unabhängig von der Mutter, nicht mit ihm verbunden, was sehr seltsam das akzeptierten Design für benutzerdefinierte Ansichten innerhalb AdapterView
s zu sein scheint. Warum dies so ist, finde ich völlig rätselhaft, aber das Muster oben für mich gearbeitet.
Für die AdaptertView addView
Methode:
void addView (Kinder)
Diese Methode wird nicht unterstützt und wirft ein UnsupportedOperationException wenn genannt.“(Von Android-Dokumentation)
Wahrscheinlich das Aufblasen Prozedur ruft die addView
Verfahren und das ist nicht möglich, von einem AdapterView
oder dessen AdapterView
.
Aus der Dokumentation:
"Ein Adapter-Objekt dient als Brücke zwischen einem AdapterView und zugrunde liegende Daten für diese Ansicht. Das Adapter ermöglicht den Zugriff auf die Daten Artikel. Der Adapter ist auch verantwortlich Für die Ansicht für jedes Element in der Datensatz“.
Ich denke, dass das Aufblasen Betrieb von einer einfachen Aktivität getan werden könnte, dass die Modelle Ihrer Ansicht und alle anderen Operationen, beispielsweise das Abrufen von Daten und Daten in anderen Klassen zeigt.
Hope wird es hilfreich sein!
@ Antwort Axel22 der ist der Schlüssel, aber es gibt ein paar andere Dinge aus dem Code fehlt. Zunächst sollten Sie entweder BaseAdapter oder ArrayAdapter werden erstrecken, je nach Ihren Wünschen. Zweitens wollen Sie in der Praxis bekommen ViewHolder der Verwendung von übermäßigen Anrufen findViewById wird, zu vermeiden und (vor allem) Recycling Ihre Ansicht.
private Class ViewHolder {
public TextView cityControl;
public TextView temperatureControl;
public ImageView skyControl;
public ViewHolder(TextView cityControl, TextView temperatureControl, ImageView skyControl) {
this.cityControl = cityControl;
this.temperatureControl = temperatureControl;
this.skyControl = skyControl;
}
Ihre getView Funktion kann Ansichten recycelt und die ViewHolder
Klasse verwendet wie folgt:
public View getView(int position, View convertView, ViewGroup parent) {
Weather weather = weatherList.get(position);
// This is how you attempt to recycle the convertView, so you aren't
// needlessly inflating layouts.
View v = convertView;
ViewHolder holder;
if (null == v) {
v = LayoutInflater.from(getContext()).inflate(R.layout.weather_row, parent, false);
TextView cityControl = (TextView)v.findViewById( R.id.city );
TextView temperatureControl = (TextView)v.findViewById( R.id.temperature );
ImageView skyControl = (ImageView)v.findViewById( R.id.sky );
holder = new ViewHolder(cityControl, temperatureControl, skyControl);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.cityControl.setText("Metropolis");
holder.temperatureControl.setText("78");
holder.skyControl.setImageResource(R.drawable.daily_planet);
return v;
}
Für jede weitere Beispiele (und andere Optimierungstipps) finden Sie unter dieses Blog-Post (oder nur google für ViewHolder).