Está en la página 1de 8

Listas

En Android, una lista representa un conjunto de elementos que se muestran los unos a continuación
de los otros.

Cada elemento de una lista puede tener de una a tres filas y cada fila puede personalizarse con
diferentes componentes (TextView, Button, ImageView...).

Para crear una lista dispone de dos métodos. La actividad que contiene la lista puede:

O bien heredar de la clase ListActivity.

O bien heredar de la clase Activity.

Para insertar datos en una lista se utiliza un adapter (adaptador). Éste permite asociar datos a una
vista que extienda de la clase AdapterView, así es fácil acceder a los datos almacenados (leer,
agregar, eliminar, modificar...) en una vista.

Android ofrece dos tipos de adapters:

ArrayAdapter: permite rellenar una lista a partir de una tabla o de una colección.

SimpleCursorAdapter: permite rellenar una lista a partir de una base de datos.

También puede crear su propio adapter simplemente heredando de la clase BaseAdapter o de un


adaptador ya existente.

1. Creación de una lista

a. ListActivity

El primer método consiste en crear una lista que herede de la clase ListActivity.

Para comenzar, cree un archivo XML que represente una vista que contenga solamente una
lista (carpeta layout).

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/list" />

</LinearLayout>

Para poder operar una ListView mediante una ListActivity, su lista debe tener obligatoriamente
como identificador @android:id/list.

A continuación, declare una actividad que herede de la clase ListActivity.

public class ListActivityExampleActivity extends ListActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Por el momento, la lista está vacía y no contiene ningún dato. Vamos a utilizar una tabla de cadenas
de caracteres como origen de datos.

private String[] androidVersion = {"Cupcake", "Donut", "Eclair",


"Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich",
"Jelly Bean"};

Cree un ArrayAdapter para inyectar en la lista los datos provenientes de la tabla declarada
anteriormente.

ArrayAdapter adapter = new ArrayAdapter(this,


android.R.layout.simple_list_item_1,
androidVersion);

El método que permite construir un ArrayAdapter recibe tres parámetros:

El primer parámetro representa el contexto de la actividad actual.

El segundo parámetro representa el layout que se aplicará a cada fila de la lista. Puede o
bien crear un layout personalizado, o bien utilizar alguno de los proporcionados por Android.

El tercer parámetro representa la tabla de datos que se insertará en la lista.

El último paso consiste en asociar el adaptador, que contiene los datos que se inyectarán, a la
lista. Para ello, se utiliza el método setListAdapter:

SetListAdapter(adapter);

A continuación, puede probar este ejemplo. Debería obtener el siguiente resultado:


b. ListView

La segunda forma de crear una lista es, simplemente, usar una actividad.

Para ello, hay que crear el archivo XML que representa la lista.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/myList" />

</LinearLayout>

Este método ofrece la posibilidad de especificar un identificador a su elección.

Modifique la actividad para recuperar la instancia de la lista (mediante el


métodofindViewById).

ListView myList = (ListView) findViewById(R.id.myList);

Como en el caso anterior, el ejemplo utiliza una tabla de cadenas de caracteres así como
unArrayAdapter.

Para finalizar, hay que asociar el adaptador a la lista.

myList.setAdapter(adapter);

El uso de una ListActivity es aconsejable si su vista sólo contiene una lista.

c. Adapter y lista personalizada

También puede crear adapters personalizados para gestionar mejor la visualización y los datos de
una lista.

A continuación se muestra un ejemplo que permite mostrar una lista que contiene el nombre y el
número de las diferentes versiones de Android usando un adapter personalizado.

Para comenzar, cree la clase AndroidVersion, que representa cualquier versión de Android.

public class AndroidVersion {

private String versionName;


private String versionNumber;

public String getVersionName() {


return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
public String getVersionNumber() {
return versionNumber;
}
public void setVersionNumber(String versionNumber) {
this.versionNumber = versionNumber;
}

El ejemplo utiliza un adapter personalizado que hereda de la clase ArrayAdapter (ya que utiliza una
tabla para inyectar datos en la lista).

Para ello, cree un archivo que representará la lista.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/myList"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>

Para personalizar la lista y hacerla más rica y agradable, hay que crear un layout personalizado que
servirá para especificar la interfaz correspondiente a cada fila de la lista.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip" >

<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dp"
android:src="@drawable/list_icon" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
/>

<TextView
android:id="@+id/description"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

</LinearLayout>

</LinearLayout>
Por lo tanto, cada fila de la lista se compone de los siguientes elementos:

Un LinearLayout horizontal.

Una imagen.

La imagen se ubica en la carpeta drawable.

La imagen tiene un espaciado exterior (margin) derecho de 6dp.

Se utiliza un segundo LinearLayout (vertical) para mostrar los dos textos (título y
descripción).

Un primer texto que indica el título de la fila.

Un segundo texto que indica la descripción de la fila.

A continuación, cree una clase que represente el adapter personalizado. Tendrá las siguientes
características específicas:

Heredará de la clase ArrayAdapter, ya que los datos se completarán usando una tabla.

Cada elemento de la lista representará una versión de Android.

Tendrá los dos siguientes métodos:

Un constructor.

Un método getView: cada llamada a este método permitirá obtener una fila (dato y
valor) de la lista que se encontrará en una posición determinada.

public class AndroidAdapter extends ArrayAdapter<AndroidVersion>


{

ArrayList<AndroidVersion> androidVer;
int viewRes;

public AndroidAdapter(Context context, int


textViewResourceId,
ArrayList<AndroidVersion> versions) {
super(context, textViewResourceId, versions);
this.androidVer = versions;
this.context = context;
this.viewRes = textViewResourceId;
}

@Override
public View getView(int position, View convertView, ViewGroup
parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(viewRes, parent, false);
}
AndroidVersion o = androidVer.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.title);
TextView bt = (TextView)
v.findViewById(R.id.description);
if (tt != null) {
tt.setText("Nombre de la versión: " +
o.getVersionName());
}
if (bt != null) {
bt.setText("Número de la versión: " +
o.getVersionNumber());
}
}
return v;
}
}

El constructor sirve para almacenar los tres parámetros necesarios para implementar el adapter:

El contexto de la vista.

El layout correspondiente a la vista personalizada, aplicado a cada fila de la lista.

La tabla que representa los datos que se insertarán en la lista.

El método getView(int position, Viwe convertView, ViewGroup parent):

Este método permite obtener la vista a partir de una fila determinada (parámetro position).

La vista que representa la lista se pasa por parámetro al método (parámetro convertView).

La vista padre se pasa por parámetro (parámetro parent).

La vista personalizada debe cargarse mediante el método inflate. Una vez se ha cargado,
se pasará por parámetro al método getView (parámetro convertView) en las siguientes
llamadas, lo que reduce el número de llamadas al método inflate (llamada con bastante
coste).

A continuación, hay que obtener el texto correspondiente a la fila que se desea mostrar.

Por último, hay que obtener los dos TextView (título y descripción de una fila) para
rellenarlos con los datos obtenidos en el paso anterior.

Puede ir más allá en la optimización de una lista mediante el sistema de holder.

Para acabar, cree una actividad que permita inicializar la vista, el adapter personalizado y los
datos.

public class CustomAdapterExampleActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ArrayList<AndroidVersion> androidList = new


ArrayList<AndroidVersion>();

initList(androidList);

AndroidAdapter adapter = new AndroidAdapter(this,


R.layout.list_layout, androidList);
final ListView list = (ListView)
findViewById(R.id.myList);
list.setAdapter(adapter);
}

private void initList(ArrayList<AndroidVersion> androidList)


{
AndroidVersion version = new AndroidVersion();
version.setVersionName("Cupcake");
version.setVersionNumber("1.5");
androidList.add(version);

AndroidVersion versionDonut = new AndroidVersion();


versionDonut.setVersionName("Donut");
versionDonut.setVersionNumber("1.6");
androidList.add(versionDonut);

AndroidVersion versionEclair = new AndroidVersion();


versionEclair.setVersionName("Eclair");
versionEclair.setVersionNumber("2.0.x");
androidList.add(versionEclair);

AndroidVersion versionFroyo = new AndroidVersion();


versionFroyo.setVersionName("Froyo");
versionFroyo.setVersionNumber("2.2.x");
androidList.add(versionFroyo);

.........
}
}

Esta actividad permite:

Inicializar la lista de datos (método initList).

Inicializar el adapter pasándole los parámetros necesarios para su buen funcionamiento


(contexto, vista y datos).

Obtener la lista y asociarla al adapter.

Con lo que se obtendrá:

Gestión del clic en una lista

Para gestionar el clic en cada uno de los elementos de una lista, utilice el
métodosetOnItem ClickListener en la instancia de la lista deseada.
list.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> adapter, View v, int
position, long id) {
AndroidVersion selectedItem = (AndroidVersion)
adapter.getItemAtPosition(position);
Log.v("CustomAdapterExample", "Elemento seleccionado: "
+ selectedItem.getVersionName());
}
});

El método onItemClick recibe cuarto argumentos:

El adapter sobre el que se ha hecho clic.

La vista en la que se ha producido el clic.

La posición del clic en el adapter.

El identificador de la posición del clic en la vista.

A continuación, obtenga la instancia de la clase AndroidVersion que se corresponde con el


elemento seleccionado por el usuario para mostrarlo en un Log.

También podría gustarte