La clase NotesList

La actividad principal de la aplicación NotePad es NotesList, como se puede ver en el manifest. La clase NotesList se define en el archivo NotesList.java, y es la responsable de la pantalla principal de la aplicación, mostrando una lista de las notas disponibles. Para ello hacemos que esta clase herede de ListActivity, un tipo de actividad especial diseñada para enlazarse a un cursor y mostrar los elementos del cursor en una lista.

Al iniciar la aplicación se invoca esta clase a través de su método onCreate:

   1: @Override
   2: protected void onCreate(Bundle icicle) {
   3:     super.onCreate(icicle);
   4:
   5:     setDefaultKeyMode(SHORTCUT_DEFAULT_KEYS);
   6:
   7:     Intent intent = getIntent();
   8:     if (intent.getData() == null)
   9:         intent.setData(NotePad.Notes.CONTENT_URI);
  10:
  11:     setupListStripes();
  12:
  13:     Uri uri = intent.getData();
  14:     mCursor = managedQuery(uri, PROJECTION, null, null);
  15:
  16:     ListAdapter adapter = new SimpleCursorAdapter(this,
  17:             R.layout.noteslist_item, mCursor,
  18:             new String[] {NotePad.Notes.TITLE},
  19:             new int[] {android.R.id.text1});
  20:     setListAdapter(adapter);
  21: }

En la línea 5 simplemente habilitamos los atajos de teclado. Las líneas 7-9 establecen el esquema de datos sobre el que vamos a operar, que se define en la clase NotePad. Lo veremos más adelante.

Las líneas 13 y 14 acceden a los datos. Las referencias a los orígenes de datos son objetos de tipo Uri, y en nuestro caso tienen esta forma:

   1: public static final Uri CONTENT_URI =
   2:     Uri.parse("content://com.google.provider.NotePad/notes");

El enlace entre este Uri y la base de datos se realiza en la clase NotePadProvider, que veremos en otra entrada. Basta decir por ahora que la línea 14 accede a la base de datos para abrir un cursor con las columnas especificadas por PROJECTION, que se define al comienzo de la clase NotesList:

   1: private static final String[] PROJECTION = new String[] {
   2:     NotePad.Notes._ID, NotePad.Notes.TITLE };
   3: private Cursor mCursor;

Como decíamos al principio, la actividad NotesList hereda de ListActivity, lo que le permite mostrar datos en una lista. Para ello creamos un adaptador ListAdapter, como se muestra en las líneas 16-19. La clase SimpleCursorAdaptor es un creador genérico de adaptadores, al que indicamos el layout que vamos a usar (en nuestro caso R.layout.noteslist_item), el cursor que hemos definido, los nombres de las columnas a mostrar (en este caso sólo el título), y los ids de los controles (tienen que ser del tipo TextView) que van a mostrar cada columna. ´

Finalmente el método setListAdapter asigna el ListAdapter a nuestra actividad para mostrar los datos.

Nos queda por ver el método setupListStripes:

   1: private void setupListStripes() {
   2:     Drawable[] lineBackgrounds = new Drawable[2];
   3:
   4:     lineBackgrounds[0] =
   5:         getResources().getDrawable(R.drawable.even_stripe);
   6:     lineBackgrounds[1] =
   7:         getResources().getDrawable(R.drawable.odd_stripe);
   8:
   9:     View view = getViewInflate().inflate(
  10:             android.R.layout.simple_list_item_1, null, null);
  11:     TextView v = (TextView)view.findViewById(android.R.id.text1);
  12:     v.setText("X");
  13:     v.measure(
  14:         View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.EXACTLY, 100),
  15:         View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, 0)
  16:         );
  17:     int height = v.getMeasuredHeight();
  18:     getListView().setStripes(lineBackgrounds, height);
  19: }
Este método es el encargado de dibujar líneas de colores distintos para el fondo de la ventana. Para ello definimos dos objetos Drawable, que no es más que una clase genérica para objetos dibujables, y a cada uno le asignamos un color (los colores se definen en el archivo colors.xml).
Las líneas 10 y 11 instancian una vista estándar para mostrar elementos de una lista, y la 12 obtiene el objeto TextView correspondiente al control que previamente hemos visto que mostrará la columna título de las notas.
Las líneas 12-16 hacen lo siguiente: escriben una ‘X’ en el control, luego le piden al control que decida las medidas necesarias para mostrar la información, definiendo un ancho máximo y dejando libertad al alto, para que ocupe lo que necesite. Luego obtenemos ese alto, que será el necesario para que el control muestre letras mayúsculas.
La línea 18 llama al método setStripes de la vista asociada a nuestra actividad, que se encarga de establecer un fondo con líneas alternas de los colores definidos al principio y la altura obtenida.
En la próxima entrada hablaremos del menú y de como interactuar con las notas mostradas.

Entradas relacionadas:

Programando en Android – Prólogo

Programando en Android – Conceptos iniciales (I)

Programando en Android – Conceptos iniciales (II)

Programando en Android – NotePad (I)