Skip to content

Most visited

Recently visited

navigation

Vista de lista

En este documento:

  1. Usar un cargador
  2. Ejemplo

Clases fundamentales

  1. ListView
  2. Adapter
  3. CursorLoader

Consulta también:

  1. Cargadores

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" />

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)