2012-12-13 4 views
5

Beim Schreiben meines eigenen Adapters, der die ArrayAdapter Klasse erweitert, stieß ich auf die verschiedenen verfügbaren Konstruktoren und ich bemerkte, dass sie alle einen textViewResourceId Parameter benötigen. So zunächst, entschied ich mich, dass ich meine benutzerdefinierte Adapterklasse füttern android.R.id.text1:Ist das Argument textViewResourceId immer notwendig?

MyAdapter adapter = new MyAdapter(this, R.layout.myRow, android.R.id.text1); 

jedoch später während meiner Entwicklung, habe ich beschlossen, getView Methode außer Kraft zu setzen, wo ich würde

TextView label = (TextView) myRow.findViewById(android.R.id.text1); 
label.setText("Position #" + position); 

Welche hat gut funktioniert. Aber dann kam diese Frage in den Sinn: Wenn ich die Logik für mache, wie die Zeile angezeigt werden, ist es wirklich notwendig, eine textViewResourceId an den Konstruktor zur Verfügung zu stellen, wenn ich meine benutzerdefinierten Adapter initiieren? Oder ist es der Fall, dass, wenn Sie getView überschreiben, dieser Parameter nicht mehr notwendig ist? Wenn mein Denken richtig ist, was ist die gängige Praxis, um den Adapter zu instancieren, obwohl Sie wissen, dass Sie das Anzeigeverhalten sowieso übersteuern werden?

Antwort

9

Wenn Sie getView überschrieben werden Sie tun NICHT eine richtige textViewResourceId angeben müssen .. Sie in 0. Die einzige Zeit, die ArrayAdapter versucht passieren kann, dass ID für den Zugriff innerhalb getView ist .. Da Sie getView zwingende und Bereitstellen Ihre eigene Ansicht textViewResourceId wird nie zugegriffen .. Da die Super-Klasse eine Sicht-ID erwartet .. müssen Sie noch eine Sicht-ID in den Super-Aufruf übergeben .. es kann jedoch nur 0 sein, da es nie verwendet wird

ArrayAdapter Source confirming all of this

Wenn Sie nicht getView .. getView im ArrayAdapter übernimmt Ihre gesamte Ansicht ein TextView ist .. Wenn Sie Ihre Ansicht nicht keine richtigen textViewResourceId angeben und nicht außer Kraft setzen ist ein TextView .. Sie werden mit Abstürzen von einem Classcast am Ende ..

+0

(upvote) Anstatt passieren 0, würde ich einen Konstruktor verwenden, die überhaupt nicht benötigen 'textViewResouceId'. – Sam

+0

@Sam - Wenn Sie ArrayAdapter verwenden möchten, müssen Sie ihm die textViewResourceId übergeben. Es kann nicht vermieden werden, da es es erwartet (auch wenn es nicht gültig ist). Sie können den Quellcode kopieren und den ArrayAdapter neu schreiben, sodass die textViewResourceId nicht benötigt wird. Jedoch, um einfach zu vermeiden, einen einzelnen int zu übergeben, ist es nicht wirklich wert. – dymmeh

+0

@Sam - Oder Sie können einen eigenen Adapter erstellen, der den BaseAdapter erweitert. Sie werden nicht die integrierte Array-Behandlung bekommen, so dass Sie das selbst tun müssten. Sie können es jedoch so anpassen, wie Sie möchten, und die grundlegenden Funktionen zum Behandeln von Arrays einbauen. – dymmeh

0

Sie keine Art von Build-in-Adapter verwenden müssen.

können Sie die BaseAdapter erweitern und Ihre eigenen Regeln machen, was zu zeigen, welche Art von Daten usw. zu halten ...

in der Tat, habe ich so gut wie nie das in Adapter gebaut, der hat aus dem Android Box, weil die Verwendung des baseAdapter sehr einfach ist.