studio llenar elementos ejemplo dinamico desplegable crear como columnas anidados agregar android android-arrayadapter android-view layout-inflater

android - llenar - ¿Cómo funciona el método getView() al crear su propio adaptador personalizado?



listview dinamico android studio (8)

Mis preguntas son:

  1. ¿Cuál es exactamente la función del LayoutInflater?
  2. ¿Por qué todos los artículos que he leído comprueban si convertview es nulo o no primero? ¿Qué significa cuando es nulo y qué significa cuando no lo es?
  3. ¿Cuál es el parámetro padre que acepta este método?

¿Cuál es exactamente la función del LayoutInflater?

Cuando diseña usando XML, todos sus elementos de interfaz de usuario son solo etiquetas y parámetros. Antes de que pueda utilizar estos elementos de la interfaz de usuario, (por ejemplo, un TextView o LinearLayout), debe crear los objetos reales correspondientes a estos elementos xml. Para eso es el inflador. El inflador usa estas etiquetas y sus parámetros correspondientes para crear los objetos reales y establecer todos los parámetros. Después de esto, puede obtener una referencia al elemento UI utilizando findViewById ().

¿Por qué todos los artículos que he leído comprueban si convertview es nulo o no primero? ¿Qué significa cuando es nulo y qué significa cuando no lo es?

Este es uno interesante. Verá, se llama a getView () cada vez que se dibuja un elemento en la lista. Ahora, antes de que se pueda dibujar el elemento, tiene que ser creado. Ahora convertView básicamente es la última vista utilizada para dibujar un elemento. En getView (), infle primero el xml y luego use findByViewID () para obtener los diversos elementos de la interfaz de usuario del elemento de lista. Cuando verificamos (convertView == null) lo que hacemos es verificar que si una vista es nula (para el primer elemento), entonces créala; de lo contrario, si ya existe, reutilícela, no es necesario volver a pasar por el proceso de inflar . Lo hace mucho más eficiente.

También debe haber encontrado un concepto de ViewHolder en getView (). Esto hace que la lista sea más eficiente. Lo que hacemos es crear un visitante y almacenar la referencia a todos los elementos de la interfaz de usuario que obtuvimos después de inflar. De esta forma, podemos evitar llamar a los numerosos findByViewId () y ahorrar en mucho tiempo. Este ViewHolder se crea en la condición (convertView == null) y se almacena en convertView usando setTag (). En el bucle else lo recuperamos usando getView () y lo reutilizamos.

¿Cuál es el parámetro padre que acepta este método?

El elemento primario es un grupo de visualización al que finalmente se adjunta su vista creada por getView (). Ahora en tu caso, este sería el ListView.

Espero que esto ayude :)


  1. El inflador de diseño infla / agrega XML externo a su vista actual.

  2. getView () se llama en numerosas ocasiones, incluso cuando se desplaza. Por lo tanto, si ya tiene la vista inflada no queremos volver a hacerlo ya que inflar es un proceso costoso ... por eso comprobamos si es nulo y luego lo inflamos.

  3. La vista principal es una sola celda de su lista.


Puedes echar un vistazo a este video sobre la vista de lista. Es de los últimos años Google IO y sigue siendo el mejor recorrido en lista de vistas en mi mente.

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. Se infla los diseños (los archivos xml en su carpeta res / layout /) en objetos Java como LinearLayout y otras vistas.

  2. Mira el video, te mantendrá al día con cuál es el uso de la vista convertida, básicamente es una vista reciclada que espera ser reutilizada por ti, para evitar crear un objeto nuevo y ralentizar el desplazamiento de tu lista.

  3. Le permite hacer referencia a su vista de lista desde el adaptador.


También puede encontrar información útil sobre getView en la interfaz del adaptador en el archivo Adapter.java. Dice;

/** * Get a View that displays the data at the specified position in the data set. You can either * create a View manually or inflate it from an XML layout file. When the View is inflated, the * parent View (GridView, ListView...) will apply default layout parameters unless you use * {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)} * to specify a root view and to prevent attachment to the root. * * @param position The position of the item within the adapter''s data set of the item whose view * we want. * @param convertView The old view to reuse, if possible. Note: You should check that this view * is non-null and of an appropriate type before using. If it is not possible to convert * this view to display the correct data, this method can create a new view. * Heterogeneous lists can specify their number of view types, so that this View is * always of the right type (see {@link #getViewTypeCount()} and * {@link #getItemViewType(int)}). * @param parent The parent that this view will eventually be attached to * @return A View corresponding to the data at the specified position. */ View getView(int position, View convertView, ViewGroup parent);


1: LayoutInflater toma su diseño de archivos XML y crea diferentes objetos de LayoutInflater de su contenido.

2: Los adaptadores están diseñados para reutilizar Vistas, cuando una Vista se desplaza para que ya no esté visible, se puede usar para que aparezca una de las Vistas nuevas. Esta vista reutilizada es convertView . Si esto es nulo, significa que no hay una Vista reciclada y tenemos que crear una nueva, de lo contrario deberíamos usarla para evitar crear una nueva.

3: se proporciona el elemento principal para que pueda inflar su vista en los parámetros de diseño adecuados.

Todos estos elementos juntos se pueden usar para crear efectivamente la vista que aparecerá en su lista (u otra vista que tome un adaptador):

public View getView (int position, View convertView, ViewGroup parent){ if( convertView == null ){ //We must create a View: convertView = inflater.inflate(R.layout.my_list_item, parent, false); } //Here we can do changes to the convertView, such as set a text on a TextView //or an image on an ImageView. return convertView; }

Observe el uso de LayoutInflater , ese elemento parent se puede utilizar como argumento para ello y cómo se convertView utilizar convertView .


getView() método getView() en Adapter es para generar la vista de elementos de un ListView , Gallery , ...

  1. LayoutInflater se utiliza para obtener el objeto View que usted define en un xml de diseño (el objeto raíz, normalmente un LinearLayout , FrameLayout o RelativeLayout )

  2. convertView es para reciclaje. Supongamos que tiene una vista de lista que solo puede mostrar 10 elementos a la vez, y actualmente muestra el elemento 1 -> elemento 10. Cuando se desplaza hacia abajo un elemento, el elemento 1 estará fuera de la pantalla y se mostrará el elemento 11 . Para generar Vista para el ítem 11, se llamará al método getView (), y convertView aquí es la vista del ítem 1 (que ya no es necesario). Entonces, en su lugar, cree un nuevo objeto de vista para el elemento 11 (que es costoso), ¿por qué no volver a usar convertView ? => simplemente comprobamos que convertView es nulo o no, si null crea una nueva vista, de lo contrario reutiliza convertView .

  3. parentView es la vista que contiene la vista del elemento que getView() genera. Normalmente es ListView o Galería ...

Nota : no llama a este método directamente, solo necesita implementarlo para decirle a la vista principal cómo generar la vista del elemento.


LayoutInflater se utiliza para generar vistas dinámicas del XML para el elemento ListView o en onCreateView del fragmento.

ConvertView se utiliza básicamente para reciclar las vistas que actualmente no están en la vista. Supongamos que tiene un ListView desplazable. Al desplazarse hacia abajo o hacia arriba, convertView proporciona la vista que se desplazó. Esta reutilización ahorra memoria.

El parámetro principal del método getView() da una referencia al diseño principal que tiene el listView. Supongamos que quiere obtener el Id de cualquier artículo en el XML principal que puede usar:

ViewParent nv = parent.getParent(); while (nv != null) { if (View.class.isInstance(nv)) { final View button = ((View) nv).findViewById(R.id.remove); if (button != null) { // FOUND IT! // do something, then break; button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Log.d("Remove", "Remove clicked"); ((Button) button).setText("Hi"); } }); } break; } }


getView() método getView() crea una nueva View o ViewGroup de ViewGroup para cada fila de Listview o Spinner. Puede definir esta View o grupo de ViewGroup en un archivo Layout XML res/layout carpeta res/layout y puede asignarle la referencia al objeto clase Adapter .

si tiene 4 elementos en una matriz pasada a Adapter. getView() método getView() creará 4 vistas para 4 filas de Adaper.

La clase LayoutInflater tiene un método inflate () que crea View Object desde el diseño de recursos XML.