List View en Android

Listview1Listview2

Código fuente de Github de los ejemplos en este Post

En Android para mostrar una lista de elementos lo más común es usar un “List View” y un “Adapter”. La idea es básicamente generar un elemento de la interfaz gráfica a partir de cada uno de los datos. Los “List view” son ampliamente utilizados para listas cortas u opciones de menú y pueden verse por ejemplo en una la lista de reproducción de música o una lista de videos en YouTube.

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

    <TextView
        android:id="@+id/nombre_contacto"
        android:layout_width="fill_parent"
        android:layout_height="26dip"
        android:layout_alignParentTop="true"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/telefono_contacto"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignWithParentIfMissing="true"
  		android:layout_alignParentBottom="true"
        android:gravity="center_vertical"
        android:textSize="12sp" />

</RelativeLayout>

Después creamos nuestro Adapter derivando de la clase ArrayAdapter.En el método getView buscamos cada elemento de los elementos de la interfaz y asignamos la información correspondiente al Contacto actual.

public class ContactosArrayAdapter extends ArrayAdapter<Contacto> {
	private final List<Contacto> contactos;
	private final Context context;

	public ContactosArrayAdapter(Context context, int resource,
			List<Contacto> objects) {
		super(context, resource, objects);
		this.contactos = objects;
		this.context = context;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Contacto contacto = contactos.get(position);
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View rowView = inflater.inflate(R.layout.list_view, parent, false);
		TextView nombreTextView = (TextView) rowView.findViewById(R.id.nombre_contacto);
		TextView telefonoTextView = (TextView) rowView.findViewById(R.id.telefono_contacto);
		nombreTextView.setText(contacto.getName());
		telefonoTextView.setText(contacto.getTelefono());
		return rowView;
	}
}

Despues incluimos nuestro ContactosAdapter en el fragmento con la información de contactos. En una aplicación real consultaria los datos de una DB o un servicio web.

public class ContactosFragment extends ListFragment {

	public ContactosFragment() {
	}

	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		ContactosArrayAdapter adapter = new ContactosArrayAdapter(
				getActivity(), R.layout.list_view,
				ContatosInformacion.getContactos());
		setListAdapter(adapter);
	}

}

Finalmente incluimos el fragmento en la actividad principal.

public class ContactosActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		if (savedInstanceState == null) {
			getFragmentManager().beginTransaction()
					.add(R.id.container, new ContactosFragment()).commit();
		}
	}
}

Ahora si quisiéramos agregar una vista de detalles o (DetailView) podríamos utilizar el click event del ContactosFragment y llamar a nuestra actividad. Les adjunto el código para generando una notificación con el contacto seleccionado.

Contacto contacto = ContactosInformacion.getContactos().get(position);
Toast toast = Toast.makeText(v.getContext(), contacto.getName(), Toast.LENGTH_LONG);
toast.show();

Ya esta!. List View implementado en Android.

ListviewDemo