¿Cómo obtener un inflador de diseño dado un contexto?

226

Estoy escribiendo una implementación personalizada de un ListAdapter.

En su constructor, estoy tomando un Contexto, un ID de recurso (es decir, R.id.xxx que representa el archivo de diseño) y una lista y un mapa (estos contienen los datos).

Ahora, el problema es que necesitaré un LayoutInflater para obtener el objeto View que está en el archivo XML de diseño separado.

¿Cómo puedo obtener el LayoutInflater dado solo el contexto?

Ahora, por qué creo que esto es posible, es que esto es bastante similar a lo que se pasa al constructor de un ArrayAdapter (contexto, recurso, textViewResourceId, matriz de datos), y creo que el ArrayAdapter también tiene que usar un LayoutInflater dado solo un contexto.

¿Pero cómo se puede hacer?

Edwin Lee
fuente

Respuestas:

515

Puedes usar el static from()método de la LayoutInflaterclase :

 LayoutInflater li = LayoutInflater.from(context);
Dave Webb
fuente
11
¡Gracias! Estaba tratando de encontrar Context.getSomething (). getAnotherThing (). getLayoutInflater ()!
Edwin Lee
Este es el único método que funcionó para mí. Todos los demás que he probado hasta ahora arrojaron una excepción.
num1
44
¿Es costoso obtener el inflador cada vez que se necesita, es decir, cree que deberíamos salvar a un miembro del inflador?
AlikElzin-kilaka
Por cierto, creo que deberíamos usar LayoutInflater li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) ya que finalmente LayoutInflater.from (context) está haciendo lo mismo dentro.
Ankur Chaudhary
3
¿Cuál es el mejor? El que tiene 270 votos o el que tiene más de 25 votos
DJphy
53

También puede usar este código para obtener LayoutInflater:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
NguyenDat
fuente
40
¿Cuál es la diferencia entre LayoutInflater.from (Context ctx) y este getSustemService (...)?
Teo Choong Ping
8
+1, para una buena pregunta, en la implementación del método LayoutInflater.from (context) también llame a context.getSystemService () para obtener el proveedor de servicios LayoutInflater del administrador del sistema. Por lo tanto, puede haber una diferencia de basura en la pila de llamadas.
NguyenDat
11
LayoutInflater.from (context) también arroja un error si el inflador no se puede recuperar: aquí el código: LayoutInflater estático público de (Context context) {LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) {throw new AssertionError ("LayoutInflater no encontrado"); } return LayoutInflater; }
Hiep