Wie bekomme ich einen Layout-Inflater in einem bestimmten Kontext?

226

Ich schreibe eine benutzerdefinierte Implementierung eines ListAdapter.

In seinem Konstruktor nehme ich einen Kontext, eine Ressourcen-ID (dh R.id.xxx, die die Layoutdatei darstellt) sowie eine Liste und eine Karte (diese enthalten die Daten) auf.

Das Problem ist nun, dass ich einen LayoutInflater benötige, um das View-Objekt zu erhalten, das sich in der separaten Layout-XML-Datei befindet.

Wie kann ich den LayoutInflater nur mit dem Kontext erreichen?

Ich halte dies für möglich, da dies dem sehr ähnlich ist, was an den Konstruktor eines ArrayAdapters übergeben wird (Kontext, Ressource, textViewResourceId, Datenarray), und ich denke, dass der ArrayAdapter auch a verwenden muss LayoutInflater gibt nur einen Kontext an.

Aber wie geht das?

Edwin Lee
quelle

Antworten:

515

Sie können die static from()Methode aus der LayoutInflaterKlasse verwenden :

 LayoutInflater li = LayoutInflater.from(context);
Dave Webb
quelle
11
Vielen Dank! Ich habe versucht, Context.getSomething (). getAnotherThing (). getLayoutInflater () zu finden!
Edwin Lee
Dies ist die einzige Methode, die bei mir funktioniert hat. Jeder andere, den ich bisher ausprobiert habe, warf eine Ausnahme.
Nummer 1
4
Ist es teuer, den Inflater jedes Mal zu bekommen, wenn dies erforderlich ist? Denken Sie also, wir sollten ein Mitglied des Inflators retten?
AlikElzin-Kilaka
Übrigens denke ich, wir sollten LayoutInflater verwenden li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE), da letztendlich LayoutInflater.from (context) dasselbe im Inneren tut.
Ankur Chaudhary
3
Welches ist das bessere? Das mit 270 Stimmen oder das mit 25+ Stimmen
DJphy
53

Sie können diesen Code auch verwenden, um LayoutInflater abzurufen:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
NguyenDat
quelle
40
Was ist der Unterschied zwischen LayoutInflater.from (Context ctx) und diesem getSustemService (...)?
Teo Choong Ping
8
+1, für eine nette Frage, rufen Sie bei der Implementierung der Methode LayoutInflater.from (context) auch context.getSystemService () auf, um LayoutInflater Service Provider vom System Manager abzurufen. Möglicherweise liegt also ein Wurfunterschied im Aufrufstapel vor.
NguyenDat
11
LayoutInflater.from (context) löst auch einen Fehler aus, wenn der Inflater nicht abgerufen werden kann: hier der Code: public static LayoutInflater from (Kontextkontext) {LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) {neuen AssertionError auslösen ("LayoutInflater nicht gefunden."); } return LayoutInflater; }
Hiep