ListView
es un grupo de vistas que muestra una lista
de elementos desplazables. Los elementos de la lista se insertan automáticamente en la lista con un Adapter
que toma contenido de una fuente, como una matriz o consulta de base de datos, y
convierte cada resultado en una vista que se dispone en la lista.
Para obtener información básica sobre cómo insertar vistas de forma dinámica con un adaptador, consulta el documento Crear diseños con un adaptador.

Usar un cargador
El uso de un CursorLoader
es el método convencional para consultar un Cursor
como una tarea asincrónica, para evitar que la consulta bloquee el subproceso principal de tu
app. Cuando CursorLoader
recibe el resultado de Cursor
, LoaderCallbacks
recibe un callback para onLoadFinished()
, que es
el punto en el cual actualizas tu Adapter
con el nuevo Cursor
, y luego la vista de lista
muestra los resultados.
Si bien las CursorLoader
API se usaron por primera vez en
Android 3.0 (nivel de API 11), también se encuentran disponibles en la biblioteca de compatibilidad para que tu app las use
en dispositivos con Android 1.6 o versiones posteriores.
Si deseas más información sobre el uso de Loader
para cargar datos de forma asincrónica, consulta la guía de Cargadores.
Ejemplo
En el siguiente ejemplo, se usa ListActivity
, una actividad que incluye
un ListView
como su único elemento de diseño de forma predeterminada. Realiza una consulta
al proveedor de
contactos para obtener una lista de nombres y números telefónicos.
La actividad implementa la interfaz de LoaderCallbacks
para poder usar un CursorLoader
que
cargue los datos de forma dinámica para la vista de lista.
public class ListViewLoader extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { // This is the Adapter being used to display the list's data SimpleCursorAdapter mAdapter; // These are the Contacts rows that we will retrieve static final String[] PROJECTION = new String[] {ContactsContract.Data._ID, ContactsContract.Data.DISPLAY_NAME}; // This is the select criteria static final String SELECTION = "((" + ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Data.DISPLAY_NAME + " != '' ))"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a progress bar to display while the list loads ProgressBar progressBar = new ProgressBar(this); progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER)); progressBar.setIndeterminate(true); getListView().setEmptyView(progressBar); // Must add the progress bar to the root of the layout ViewGroup root = (ViewGroup) findViewById(android.R.id.content); root.addView(progressBar); // For the cursor adapter, specify which columns go into which views String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME}; int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1 // Create an empty adapter we will use to display the loaded data. // We pass null for the cursor, then update it in onLoadFinished() mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, fromColumns, toViews, 0); setListAdapter(mAdapter); // Prepare the loader. Either re-connect with an existing one, // or start a new one. getLoaderManager().initLoader(0, null, this); } // Called when a new Loader needs to be created public Loader<Cursor> onCreateLoader(int id, Bundle args) { // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. return new CursorLoader(this, ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, null); } // Called when a previously created loader has finished loading public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // Swap the new cursor in. (The framework will take care of closing the // old cursor once we return.) mAdapter.swapCursor(data); } // Called when a previously created loader is reset, making the data unavailable public void onLoaderReset(Loader<Cursor> loader) { // This is called when the last Cursor provided to onLoadFinished() // above is about to be closed. We need to make sure we are no // longer using it. mAdapter.swapCursor(null); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // Do something when a list item is clicked } }
Nota: Dado que en este ejemplo se realiza una consulta en el proveedor de
contactos, tu
app debe solicitar el permiso de READ_CONTACTS
en el archivo de manifiesto si deseas probar este código:
<uses-permission android:name="android.permission.READ_CONTACTS" />