Como obter um inflator de layout em um contexto?

226

Estou escrevendo uma implementação personalizada de um ListAdapter.

Em seu construtor, estou analisando um Contexto, um ID de recurso (ou seja, R.id.xxx representando o arquivo de layout) e uma lista e um mapa (estes contêm os dados).

Agora, o problema é que precisarei de um LayoutInflater para obter o objeto View, que está no arquivo XML de layout separado.

Como eu posso me apossar do LayoutInflater dado apenas o Contexto?

Agora, por que acho que isso é possível, é que isso é bastante semelhante ao que está sendo passado para o construtor de um ArrayAdapter (contexto, recurso, textViewResourceId, matriz de dados), e acho que o ArrayAdapter também deve usar um LayoutInflater fornecido apenas um contexto.

Mas como isso pode ser feito?

Edwin Lee
fonte

Respostas:

515

Você pode usar o static from()método da LayoutInflaterclasse :

 LayoutInflater li = LayoutInflater.from(context);
Dave Webb
fonte
11
Obrigado! Eu estava tentando encontrar Context.getSomething (). getAnotherThing (). getLayoutInflater ()!
Edwin Lee
Este é o único método que funcionou para mim. Todos os outros que eu tentei até agora lançaram uma exceção.
num1
4
É caro obter o inflador sempre que necessário, ou seja, você acha que devemos salvar um membro do inflador?
AlikElzin-Kilaka
BTW eu acho que devemos usar LayoutInflater li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) como finalmente LayoutInflater.from (context) está fazendo o mesmo por dentro.
Ankur Chaudhary
3
Qual é o melhor? Aquele com 270 votos ou aquele com 25 votos ou mais #
DJphy
53

Você também pode usar esse código para obter o LayoutInflater:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
NguyenDat
fonte
40
Qual é a diferença entre LayoutInflater.from (Context ctx) e este getSustemService (...)?
Teo Choong Ping
8
+1, para uma boa pergunta, no implemento do método LayoutInflater.from (context) também chame context.getSystemService () para obter o Provedor de Serviços LayoutInflater do System Manager. Portanto, pode haver uma diferença de ninhada na pilha de chamadas.
NguyenDat
11
LayoutInflater.from (context) também gera erro se o inflator não puder ser recuperado: aqui o código: public estático LayoutInflater de (Contexto do contexto) {LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) {lança novo AssertionError ("LayoutInflater não encontrado."); } retornar LayoutInflater; }
Hiep