Imprimir

Obtener el identificador del objeto seleccionado en la lista

En la clase xxxxxListFragment se encuentra declarado el método onListItemClick, que se ejecutará cuando el usuario pulse sobre un elemento de la lista. Ahí se encuentra una línea de código que se encarga de transmitir a la clase xxxxxListActivity el identificador (id) del elemento que se ha seleccionado. Por tanto hay que modificar esa línea para que en lugar de coger el id de los elementos Dummy de ejemplo, se tome el id de la persona elegida, teniendo en cuenta que la variable position contiene el número de orden en la lista del elemento que ha seleccionado el usuario. Además, y con el fin de modificar lo mínimo posible el código generado por el asistente, ese identificador, que en este ejemplo es de tipo int, se debe convertir a String, ya así lo va a tomar la clase xxxxxListActivity que hace de contenedor para este Fragment

    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) {
        super.onListItemClick(listView, view, position, id);
 
        // Notify the active callbacks interface (the activity, if the
        // fragment is attached to one) that an item has been selected.
//        mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
        int idPersonSelected = Persons.personList.get(position).getId();
        mCallbacks.onItemSelected(String.valueOf(idPersonSelected));
    }

Crear una estructura Map para asociar identificadores con objetos

Como se acaba de comentar, el identificador que se ha declarado como una propiedades dentro de los objetos (personas) será el dato que se va a utilizar para reconocer el elemento que se ha seleccionado en la lista, y será el dato que viajará entre las distintas clases que se han generado automáticamente por el asistente para poder conocer dicho elemento.

Pero en la aplicación será necesario poder obtener todos los datos contenidos en el objeto (persona) seleccionado. Por tanto, se necesita una herramienta para poder obtener el objeto a partir de un determinado identificador. Para ello, se va a utilizar una lista Map, de manera similar al utilizado en la clase DummyContent del proyecto. Este tipo de lista permite asociar a cada objeto un determinado valor, para posteriormente poder localizar el objeto en función de dicho valor.

En la clase DummyContent aparece declarado el Map de la siguiente manera:

    public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();

Así, de manera similar se ha creado en la clase Persons de este proyecto de ejemplo la lista Map de la siguiente manera:

    public static Map<String, Person> ITEM_MAP = new HashMap<String, Person>();

Ahora toca almacenar en esa estructura Map los emparejamientos identificador<->objeto, por lo que cada vez que se haya creado un objeto, y se le haya indicado su identificador, se debe indicar posteriormente:

        ITEM_MAP.put(String.valueOf(person.getId()), person);

Obtener el objeto seleccionado

Ahora ya podremos obtener el objeto completo que se haya seleccionado en función de su identificador, que como se ha comentado anteriormente será el dato que podremos conocer en las distintas clases del proyecto, ya que el asistente ha generado el código necesario para ello.

Los datos contenidos en el objeto (persona) se van a mostrar en la pantalla de detalle, la que aparece una vez seleccionado un determinado elemento de la lista. La gestión de esa pantalla se realiza en la clase xxxxxDetailFragment, por lo que habrá que modificar su código para poder tener almacenado en dicha clase el objeto, y así después poder extraer de él los datos que deseemos y lo pongamos en pantalla de la manera que se desee.

En las propiedades de esa clase vamos a declarar una variable que va a contener el objeto que se ha seleccionado.

//    private DummyContent.DummyItem mItem;
    private Person person;

Ahora en el método onCreate, que se ejecuta cada vez que aparece este panel (Fragment) en pantalla, se debe indicar que busque el objeto persona que esté asociado con el identificador. Este identificador le llega a esta clase a través de un argumento que ha sido gestionado por el código que se ha generado automáticamente por el asistente. La búsqueda se realizará usando la estructura Map que se ha creado en el apartado anterior.

            // Load the dummy content specified by the fragment
            // arguments. In a real-world scenario, use a Loader
            // to load content from a content provider.
//            mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
            String idPersonSelected = getArguments().getString(ARG_ITEM_ID);
            person = Persons.ITEM_MAP.get(idPersonSelected);

El primer uso que se va a hacer de los datos contenidos en el objeto obtenido será mostrar en el título uno de sus atributos. En este ejemplo se va a mostrar el alias de la persona. Así que se ha indicado el siguiente código unas líneas más abajo, una vez que se ha obtenido una referencia al barra de la pantalla (toolbar_layout)

//                appBarLayout.setTitle(mItem.content);
                appBarLayout.setTitle(person.getAlias());

Para poder probar la aplicación en este momento puedes poner como comentarios las líneas que aparezcan como errores al hacer referencia a la variable mItem cuya declaración se ha comentado o eliminado.

En la ejecución de la aplicación, al seleccionar un elemento de la lista, aparecerá la pantalla de detalle mostrando el alias del contacto como título.

Código fuente

Puedes ver el código fuente del proyecto hasta este punto en el siguiente commit del proyecto alojado en GitHub:

https://github.com/javiergarciaescobedo/AddressBookDroid/tree/1c01f35612ff247af6ffc343250f8e0769dbb0b2

 

Ver todos los artículos de este tutorial