Jak uzyskać układ Inflater na podstawie kontekstu?

226

Piszę niestandardową implementację ListAdapter.

W jego konstruktorze pobieram kontekst, identyfikator zasobu (tj. R.id.xxx reprezentujący plik układu) oraz listę i mapę (te zawierają dane).

Problem polega na tym, że będę potrzebować LayoutInflater, aby uzyskać obiekt View znajdujący się w osobnym pliku XML układu.

Jak mogę zdobyć LayoutInflater, mając tylko kontekst?

Teraz myślę, że jest to możliwe, ponieważ jest to dość podobne do tego, co jest przekazywane do konstruktora ArrayAdapter (kontekst, zasób, textViewResourceId, tablica danych), i uważam, że ArrayAdapter musi również użyć LayoutInflater podany tylko kontekst.

Ale jak to zrobić?

Edwin Lee
źródło

Odpowiedzi:

515

Możesz użyć static from()metody z LayoutInflaterklasy :

 LayoutInflater li = LayoutInflater.from(context);
Dave Webb
źródło
11
Dzięki! Próbowałem znaleźć Context.getSomething (). getAnotherThing (). getLayoutInflater ()!
Edwin Lee,
To jedyna metoda, która zadziałała dla mnie. Co drugi, którego do tej pory próbowałem, zgłaszał wyjątek.
num1
4
Czy uzyskanie inflatora jest drogie za każdym razem, gdy jest to potrzebne, co oznacza, czy uważasz, że powinniśmy uratować członka inflatora?
AlikElzin-kilaka
BTW, myślę, że powinniśmy użyć LayoutInflater li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE), ponieważ ostatecznie LayoutInflater.from (kontekst) robi to samo w środku.
Ankur Chaudhary
3
Który jest lepszy? Ten z 270 głosami lub ten z ponad 25 głosami
DJphy
53

Możesz także użyć tego kodu, aby uzyskać LayoutInflater:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
NguyenDat
źródło
40
Jaka jest różnica między LayoutInflater.from (Context ctx) a tym getSustemService (...)?
Teo Choong Ping
8
+1, na ładne pytanie, w implementacji metody LayoutInflater.from (kontekst) wywołuje także kontekst.getSystemService (), aby pobrać LayoutInflater Service Provider z System Managera. Więc może mieć różnicę śmieci w stosie wywołań.
NguyenDat
11
LayoutInflater.from (kontekst) generuje również błąd, jeśli nie można odzyskać inflatora: tutaj kod: publiczny statyczny LayoutInflater z (Kontekst kontekstu) {LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) {wyrzuć nowy AssertionError („Nie znaleziono LayoutInflater.”); } return LayoutInflater; }
Hiep,