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?

Respostas:


515

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

 LayoutInflater li = LayoutInflater.from(context);

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)

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.