2010-08-13 8 views

Respuesta

140

Cuando utiliza una vista personalizada en un ListView debe definir el diseño de fila. Se crea un xml donde colocar widgets de Android y luego en el código del adaptador que tiene que hacer algo como esto:

public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter { 
    super(context, 1, objects); 
    /* We get the inflator in the constructor */ 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    /* We inflate the xml which gives us a view */ 
    view = mInflater.inflate(R.layout.my_list_custom_row, parent, false); 

    /* Get the item in the adapter */ 
    MyObject myObject = getItem(position); 

    /* Get the widget with id name which is defined in the xml of the row */ 
    TextView name = (TextView) view.findViewById(R.id.name); 

    /* Populate the row's xml with info from the item */ 
    name.setText(myObject.getName()); 

    /* Return the generated view */ 
    return view; 
} 
+21

Idealmente, primero debería probar convertView para ver si puede reciclar un recurso, por lo tanto 'View view = convertView; if (ver == nulo) {view = mInflater ....} ' –

+0

@ JannieT Básicamente es como el patrón ViewHolder – Sam003

+3

No creo que esta respuesta realmente explique qué es un' LayoutInflater', aunque explica dónde usarlo . La respuesta 1 abajo es mejor. –

237

LayoutInflater clase se utiliza para crear una instancia del archivo XML de diseño en sus objetos de visualización correspondientes.

En otras palabras, toma como entrada un archivo XML y crea los objetos Vista desde él.

+64

Lo que estaba buscando es la parte "en otras palabras", ya que la parte superior ya está en los documentos API – Nipuna

+1

Esto todavía me parece bastante abstracto. Entonces, digamos que tengo un archivo 'single_list_item.xml' para cada línea de un' ListView'. ¿Es el uso de ese archivo XML algo así como un inflador? – JohnK

10

Esta clase se utiliza para crear una instancia archivo de diseño de XML en sus correspondientes View objetos. Nunca se usa directamente: use getLayoutInflater() o getSystemService(String) para recuperar una instancia estándar de LayoutInflater que ya está conectada al contexto actual y configurada correctamente para el dispositivo en el que se está ejecutando. Por ejemplo:

LayoutInflater inflater = (LayoutInflater)context.getSystemService 
     (Context.LAYOUT_INFLATER_SERVICE); 

Referencia: http://developer.android.com/reference/android/view/LayoutInflater.html

+1

Esto puede ser cierto pero no responde la pregunta. –

19

Aquí es otro ejemplo similar a la anterior, pero el período extendido de demostrar adicionalmente inflar parámetros y comportamiento dinámico que puede proporcionar.

Supongamos que su diseño de fila ListView puede tener una cantidad variable de TextViews. Primero, infle la vista del elemento base (al igual que en el ejemplo anterior) y luego realice un ciclo de forma dinámica al agregar TextViews en tiempo de ejecución. Usar android: layout_weight también alinea todo perfectamente.

Éstos son los recursos diseños:

list_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <TextView 
     android:id="@+id/field1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="2"/> 
    <TextView 
     android:id="@+id/field2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
/> 
</LinearLayout> 

schedule_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1"/> 

Anulación getView método de extensión de la clase BaseAdapter

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = activity.getLayoutInflater(); 
    View lst_item_view = inflater.inflate(R.layout.list_layout, null); 
    TextView t1 = (TextView) lst_item_view.findViewById(R.id.field1); 
    TextView t2 = (TextView) lst_item_view.findViewById(R.id.field2); 
    t1.setText("some value"); 
    t2.setText("another value"); 

    // dinamically add TextViews for each item in ArrayList list_schedule 
    for(int i = 0; i < list_schedule.size(); i++){ 
     View schedule_view = inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); 
     ((TextView)schedule_view).setText(list_schedule.get(i)); 
     ((ViewGroup) lst_item_view).addView(schedule_view); 
    } 
    return lst_item_view; 
} 

Nota método de inflado diferente llama:

inflater.inflate(R.layout.list_layout, null); // no parent 
inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); // with parent preserving LayoutParams 
5

aquí es un ejemplo de que consigue un refrence para la vista raíz de una disposición, inflar y usarlo con setContentView (Ver vista)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LayoutInflater li=getLayoutInflater(); 
    View rootView=li.inflate(R.layout.activity_main,null); 
    setContentView(rootView); 


} 
27

LayoutInflater.inflate() proporciona un medio para convertir un archivo * res/layout /. xml que define una vista en un objeto View real utilizable en años nuestro código fuente de la aplicación.

básicos dos pasos: obtener el inflado y luego inflar el recurso

¿Cómo se obtiene el inflado?

LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

¿Cómo se obtiene la vista suponiendo que el archivo XML es "list_item.xml"?

View view = inflater.inflate(R.layout.list_item, parent, false); 
6

Inflar medios de lectura del archivo XML que describe un diseño (o elemento de interfaz gráfica de usuario) y para crear los objetos reales que corresponden a la misma, y ​​por lo tanto hacer que el objeto visible dentro de una aplicación para Android.

final Dialog mDateTimeDialog = new Dialog(MainActivity.this); 

// Inflate the root layout 
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null); 

// Grab widget instance 
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker); 

Este archivo se guarda como date_time_dialog.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/DateTimeDialog" android:layout_width="100px" 
    android:layout_height="wrap_content"> 
    <com.dt.datetimepicker.DateTimePicker 
      android:id="@+id/DateTimePicker" android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    <LinearLayout android:id="@+id/ControlButtons" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      android:layout_below="@+id/DateTimePicker" 
      android:padding="5dip"> 
      <Button android:id="@+id/SetDateTime" android:layout_width="0dip" 
        android:text="@android:string/ok" android:layout_weight="1" 
        android:layout_height="wrap_content" 
        /> 
      <Button android:id="@+id/ResetDateTime" android:layout_width="0dip" 
        android:text="Reset" android:layout_weight="1" 
        android:layout_height="wrap_content" 
        /> 
      <Button android:id="@+id/CancelDialog" android:layout_width="0dip" 
        android:text="@android:string/cancel" android:layout_weight="1" 
        android:layout_height="wrap_content" 
        /> 
    </LinearLayout> 

Este archivo guardado como podría date_time_picker.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="wrap_content" `enter code here` 
    android:padding="5dip" android:id="@+id/DateTimePicker"> 
<LinearLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:baselineAligned="true" 
android:orientation="horizontal"> 

    <LinearLayout 
    android:id="@+id/month_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="1dp" 
    android:layout_marginTop="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginBottom="5dp" 
    android:gravity="center" 
    android:orientation="vertical"> 
    <Button 
     android:id="@+id/month_plus" 
     android:layout_width="45dp" 
     android:layout_height="45dp" 
     android:background="@drawable/image_button_up_final"/> 
    <EditText 
     android:id="@+id/month_display" 
     android:layout_width="45dp" 
     android:layout_height="35dp" 
     android:background="@drawable/picker_middle" 
     android:focusable="false" 
     android:gravity="center" 
     android:singleLine="true" 
     android:textColor="#000000"> 
    </EditText> 
    <Button 
     android:id="@+id/month_minus" 
     android:layout_width="45dp" 
     android:layout_height="45dp"  
     android:background="@drawable/image_button_down_final"/> 
</LinearLayout> 
<LinearLayout 
    android:id="@+id/date_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0.5dp" 
    android:layout_marginTop="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginBottom="5dp" 
    android:gravity="center" 
    android:orientation="vertical"> 
    <Button 
     android:id="@+id/date_plus" 
     android:layout_width="45dp" 
     android:layout_height="45dp"  
     android:background="@drawable/image_button_up_final"/> 
    <EditText 
     android:id="@+id/date_display" 
     android:layout_width="45dp" 
     android:layout_height="35dp" 
     android:background="@drawable/picker_middle" 
     android:gravity="center" 
     android:focusable="false" 
     android:inputType="number" 
     android:textColor="#000000" 
     android:singleLine="true"/> 
    <Button 
     android:id="@+id/date_minus" 
     android:layout_width="45dp" 
     android:layout_height="45dp"  
     android:background="@drawable/image_button_down_final"/> 
</LinearLayout> 
<LinearLayout 
    android:id="@+id/year_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0.5dp" 
    android:layout_marginTop="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginBottom="5dp" 
    android:gravity="center" 
    android:orientation="vertical"> 
    <Button 
     android:id="@+id/year_plus" 
     android:layout_width="45dp" 
     android:layout_height="45dp"  
      android:background="@drawable/image_button_up_final"/> 
    <EditText 
     android:id="@+id/year_display" 
     android:layout_width="45dp" 
     android:layout_height="35dp" 
     android:background="@drawable/picker_middle" 
     android:gravity="center" 
     android:focusable="false" 
     android:inputType="number" 
     android:textColor="#000000" 
     android:singleLine="true"/> 
    <Button 
     android:id="@+id/year_minus" 
     android:layout_width="45dp" 
     android:layout_height="45dp"  
     android:background="@drawable/image_button_down_final"/> 
</LinearLayout> 
<LinearLayout 
     android:id="@+id/hour_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_marginTop="5dp" 
     android:layout_marginBottom="5dp" 
     android:gravity="center" 
     android:orientation="vertical"> 
     <Button 
      android:id="@+id/hour_plus" 
      android:layout_width="45dp" 
      android:layout_height="45dp"   
      android:background="@drawable/image_button_up_final"/> 
     <EditText 
      android:id="@+id/hour_display" 
      android:layout_width="45dp" 
      android:layout_height="35dp" 
      android:background="@drawable/picker_middle" 
      android:gravity="center" 
      android:focusable="false" 
      android:inputType="number" 
      android:textColor="#000000" 
      android:singleLine="true"> 
     </EditText> 
     <Button 
      android:id="@+id/hour_minus" 
      android:layout_width="45dp" 
      android:layout_height="45dp"  
      android:background="@drawable/image_button_down_final"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/min_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="0.35dp" 
     android:layout_marginTop="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_marginBottom="5dp" 
     android:gravity="center" 
     android:orientation="vertical"> 
     <Button 
      android:id="@+id/min_plus" 
      android:layout_width="45dp" 
      android:layout_height="45dp"  
      android:background="@drawable/image_button_up_final"/> 
     <EditText 
      android:id="@+id/min_display" 
      android:layout_width="45dp" 
      android:layout_height="35dp" 
      android:background="@drawable/picker_middle" 
      android:gravity="center" 
      android:focusable="false" 
      android:inputType="number" 
      android:textColor="#000000" 
      android:singleLine="true"/> 
     <Button 
      android:id="@+id/min_minus" 
      android:layout_width="45dp" 
      android:layout_height="45dp"  
      android:background="@drawable/image_button_down_final"/> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/meridiem_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="0.35dp" 
     android:layout_marginTop="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_marginBottom="5dp" 
     android:gravity="center" 
     android:orientation="vertical"> 
     <ToggleButton 
      android:id="@+id/toggle_display" 
      style="@style/SpecialToggleButton" 
      android:layout_width="40dp" 
      android:layout_height="32dp" 
      android:layout_marginLeft="5dp" 
      android:layout_marginTop="45dp" 
      android:layout_marginRight="5dp" 
      android:layout_marginBottom="5dp" 
      android:padding="5dp" 
      android:gravity="center" 
      android:textOn="@string/meridiem_AM" 
      android:textOff="@string/meridiem_PM" 
      android:checked="true"/> 

      <!-- android:checked="true" --> 

    </LinearLayout> 
</LinearLayout> 
</RelativeLayout> 

La MainActivity clase guardado como MainActivity.java:

public class MainActivity extends Activity { 
    EditText editText; 
    Button button_click; 
    public static Activity me = null; 
    String meridiem; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     editText = (EditText)findViewById(R.id.edittext1); 
     button_click = (Button)findViewById(R.id.button1); 
     button_click.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view){ 
       final Dialog mDateTimeDialog = new Dialog(MainActivity.this); 
       final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null); 
       final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker); 
       // mDateTimePicker.setDateChangedListener(); 
       ((Button) mDateTimeDialogView.findViewById(R.id.SetDateTime)).setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         mDateTimePicker.clearFocus(); 
         int hour = mDateTimePicker.getHour(); 
         String result_string = mDateTimePicker.getMonth() +" "+ String.valueOf(mDateTimePicker.getDay()) + ", " + String.valueOf(mDateTimePicker.getYear()) 
         + " " +(mDateTimePicker.getHour()<=9? String.valueOf("0"+mDateTimePicker.getHour()) : String.valueOf(mDateTimePicker.getHour())) + ":" + (mDateTimePicker.getMinute()<=9?String.valueOf("0"+mDateTimePicker.getMinute()):String.valueOf(mDateTimePicker.getMinute()))+" "+mDateTimePicker.getMeridiem(); 
         editText.setText(result_string); 
         mDateTimeDialog.dismiss(); 
        } 
       }); 
       // Cancel the dialog when the "Cancel" button is clicked 
       ((Button) mDateTimeDialogView.findViewById(R.id.CancelDialog)).setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         mDateTimeDialog.cancel(); 
        } 
       }); 
       // Reset Date and Time pickers when the "Reset" button is clicked 
       ((Button) mDateTimeDialogView.findViewById(R.id.ResetDateTime)).setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         mDateTimePicker.reset(); 
        } 
       }); 

       // Setup TimePicker 
       // No title on the dialog window 
       mDateTimeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       // Set the dialog content view 
       mDateTimeDialog.setContentView(mDateTimeDialogView); 
       // Display the dialog 
       mDateTimeDialog.show(); 
      } 
     }); 
    } 
} 
0

mi Personalizar lista espero que ilustran el concepto

public class second extends ListActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second); 
// TextView textview=(TextView)findViewById(R.id.textView1); 
// textview.setText(getIntent().getExtras().getString("value")); 

    setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries))); 
} 

private class MyAdapter extends ArrayAdapter<String>{ 

    public MyAdapter(Context context, int resource, int textViewResourceId, 
      String[] objects) { 
     super(context, resource, textViewResourceId, objects); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row=inflater.inflate(R.layout.list_item,parent,false); 
     String[]items=getResources().getStringArray(R.array.counteries); 

     ImageView iv=(ImageView) row.findViewById(R.id.imageView1); 
     TextView tv=(TextView) row.findViewById(R.id.textView1); 
     tv.setText(items[position]); 

     if(items[position].equals("unitedstates")){ 
      iv.setImageResource(R.drawable.usa); 
     }else if(items[position].equals("Russia")){ 
      iv.setImageResource(R.drawable.russia); 
     }else if(items[position].equals("Japan")){ 
      iv.setImageResource(R.drawable.japan); 
     } 
     // TODO Auto-generated method stub 
     return row; 
    } 

} 

} 
0

LayoutInflater es un componente fundamental en Android. Debe usarlo todo el tiempo para convertir archivos xml en jerarquías de vista.

6

Lo que hace de inflado

Se necesita un diseño xml como entrada (por ejemplo) y la convierte en objeto de vista.

Por qué necesita

Pensemos en un escenario en el que necesitamos para crear una vista de lista personalizada. Ahora cada fila debe ser personalizada. Pero ¿cómo podemos hacerlo? No es posible asignar un diseño xml a una fila de vista de lista. Entonces, creamos un objeto View. Así podemos acceder a los elementos en él (textview, imageview, etc.) y también asignar el objeto como row of listview

Así que, siempre que necesitemos asignar view view type en algún lado y tenemos nuestro diseño xml personalizado simplemente lo convertimos a objeto por inflador y usarlo.

+0

Entonces, señor Zahan, ¿es como el DOM en Javascript? • o • –

0

LayoutInflater crea objetos de visualización basados ​​en diseños definidos en XML. Hay varias maneras diferentes de usar LayoutInflater, incluida la creación de vistas personalizadas, inflar vistas de fragmentos en vistas de actividades, crear cuadros de diálogo o simplemente inflar una vista de archivo de diseño en una actividad.

Existen muchos conceptos erróneos sobre cómo funciona el proceso de inflación. Creo que esto proviene de la documentación deficiente para el método inflate(). Si desea conocer el método de inflado() en detalle, escribí un post sobre ello aquí:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

1

Disposición de inflado es una clase que lee la descripción apariencia XML y convertirlos en basado en Java Ver objetos.

0

Inflater en realidad algún tipo de conversión a datos, vistas, instancias, a la representación de la IU visible ... esto hace uso de la alimentación de datos en adaptadores tal vez, etc. programáticamente. luego integrándolo con un xml que definió, que le dice cómo deben representarse los datos en UI

43

¿Qué hace LayoutInflator?

Cuando comencé la programación de Android, estaba realmente confundido por LayoutInflater y findViewById. A veces usamos uno y a veces el otro.

  • LayoutInflater se utiliza para crear un nuevo objeto View (o Layout) de uno de sus diseños XML.
  • findViewById simplemente le da una referencia de una vista que ya ha sido creada. Puede pensar que aún no ha creado vistas, pero siempre que llame al setContentView en onCreate, el diseño de la actividad junto con sus subvistas se infla (crea) detrás de las escenas.

Por lo tanto, si la vista ya existe, utilice findViewById. De lo contrario, créelo con LayoutInflater.

Ejemplo

Aquí es un mini proyecto que hice que muestra tanto LayoutInflater y findViewById en acción. Sin un código especial, el diseño se ve así.

enter image description here

El cuadrado azul es un diseño personalizado insertado en el diseño principal con include (ver here para más). Se infló automáticamente porque es parte de la vista de contenido. Como puede ver, no hay nada especial sobre el código.

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

Ahora vamos a inflar (Crear) otra copia de nuestro diseño personalizado y añadirlo en.

enter image description here

LayoutInflater inflater = getLayoutInflater(); 
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false); 

para inflar el nuevo diseño de vista, todo lo que hice fue decirle al inflador el nombre de mi archivo xml (my_layout), el diseño principal al que quiero agregarlo (mainLayout) y que realmente no quiero agregar aún (false). (También podría establecer el elemento principal en null, pero luego se ignorarían los parámetros de diseño de la vista raíz de mi diseño personalizado).

Aquí está de nuevo en su contexto.

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // inflate the main layout for the activity 
     setContentView(R.layout.activity_main); 

     // get a reference to the already created main layout 
     LinearLayout mainLayout = (LinearLayout) findViewById(R.id.activity_main_layout); 

     // inflate (create) another copy of our custom layout 
     LayoutInflater inflater = getLayoutInflater(); 
     View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false); 

     // make changes to our custom layout and its subviews 
     myLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent)); 
     TextView textView = (TextView) myLayout.findViewById(R.id.textView); 
     textView.setText("New Layout"); 

     // add our custom layout to the main layout 
     mainLayout.addView(myLayout); 
    } 
} 

Observe cómo findViewById se utiliza sólo después de un diseño ya ha sido inflado.

Código Suplementario

Aquí está el código XML para el ejemplo anterior.

activity_main.xml

my_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:background="@color/colorPrimary"> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:padding="5dp" 
     android:textColor="@android:color/white" 
     android:text="My Layout"/> 

</RelativeLayout> 

¿Cuándo necesita LayoutInflater

  • El momento más común la mayoría de la gente lo usa está en una RecyclerView. (Consulte estos ejemplos de RecyclerView para list o grid). Debe inflar un nuevo diseño para cada elemento visible de la lista o cuadrícula.
  • También puede usar un inflador de diseño si tiene un diseño complejo que desea agregar programáticamente (como hicimos en nuestro ejemplo). Podrías hacerlo todo en código, pero es mucho más fácil definirlo en xml primero y luego simplemente inflarlo.
+0

¡Gracias por esto! – pkpkpk