Bienvenidos sean a este post, hoy veremos una serie de modificaciones finales para nuestra aplicacion Mis Lugares, la primera va a ser una simplificacion de nuestra actividad VistaLugar porque si observamos a nuestro programa tendremos dos clases muy similares: VistaLugar y VistaLugarFragment, esto es un grave error de programacion porque tenemos dos clases redundantes, en el caso de hoy veremos como VistaLugar se reducira a mostrar un fragmento por medio de VistaLugarFragment, para ello nuestra primera accion sera crear un nuevo layout llamado activity_vista_lugar.xml donde reemplazaremos su codigo generado por el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:id="@+id/vista_lugar_fragment"
        android:name="com.tinchicus.mislugares.VistaLugarFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent" 
        android:layout_weight="1"
        android:clickable="true"/>
</LinearLayout>

En este caso crearemos un layout que tendra un fragment solamente el cual tendra dos particularidades: el primero el campo name que apuntara a la clase VistaLugarFragment y la opcion clickable que le daremos el valor true para permitir que le hagamos click al mismo, nuestra siguiente modificacion sera en el metodo onCreate() de la clase VistaLugar veamos primero el metodo:

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.vista_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        imageview = (ImageView) findViewById(R.id.foto);
        actualizarVistas();
    }

Todo este bloque lo modificaremos de la siguiente manera:

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

Tambien debemos modificar el encabezado de la clase VistaLugar a la siguiente forma:

public class VistaLugar extends FragmentActivity {

Con esto hemos logrado simplificar notablemente la clase VistaLugar, y tanto si trabaja o no con fragmentos vendra primero para esta clase y luego hara todas las tareas por medio de VistaLugarFragment, si quieren pueden eliminar todo el codigo restante de la clase VistaLugar que seguira funcionando correctamente, les recomiendo que lo prueben para verifiicar que sigue funcionando correctamente, nuestra siguiente modificacion sera para mostrar el contenido del primer lugar en el fragmento, para ello debemos ir a la clase Lugares y agregar el siguiente metodo:

    public static int primerId(){
        int id = -1;
        SQLiteDatabase db = lugaresDB.getReadableDatabase();

        Cursor c = db.rawQuery("SELECT _id FROM lugares ORDER BY _id asc LIMIT 1 ",
                null);
            if (c.moveToNext()) {
                id = c.getInt(0);
            }
            c.close();
            db.close();
        return id;
    }

En este metodo crearemos una variable llamada id donde almacenaremos el valor de _id de la base lugares, primero crearemos un objeto llamado db para conectarnos a la base, luego un cursor donde haremos un rawQuery() y ejecutaremos un query para extraer este dato, luego chequearemos por medio moveToNext() si existe este valor en caso de ser cierto lo asigna a id por medio del metodo getInt() y el campo inicial de c, luego cerraremos al cursor, a la base y por ultimo devolveremos el valor de id, nuestro siguiente paso sera modificar onCreate() en la clase MainActivity, debemos agregar el siguiente bloque pero siempre despues de asignado el valor a fragmentVista:

        if (fragmentVista!=null){
            fragmentVista.actualizarVistas(Lugares.primerId());
        }

En este caso chequeara si fragmentVista es distinta de null si es verdadero llamaremos a fragmentVista.actualizarVistas() y le enivaremos el valor por medio del metodo primerId() que creamos en la clase Lugares, veamos como quedo nuestra modificacion

Pasemos a nuestra ultima modificacion, la cual sera para ajustar el comportamiento de borrar un lugar con fragments, para ello primero veremos como es nuestro actual bloque para borrar un lugar dentro de la opcion para borrar:

Lugares.borrar((int) id);
getActivity().finish();

Esta accion si la llamamos desde un fragmento nos cerrara la aplicacion, para evitar esto debemos cambiar las lineas anteriores por las siguientes:

Lugares.borrar((int) id);
SelectorFragment selectorFragment = (SelectorFragment)
        getActivity().getSupportFragmentManager()
                .findFragmentById(R.id.selector_fragment);
if(selectorFragment == null){
    getActivity().finish();
} else {
    ((MainActivity) getActivity()).muestraLugar(Lugares
            .primerId());
    ((MainActivity) getActivity()).actualizaLista();
}

La primera linea se mantiene igual para eliminar el elemento de la base de datos, nuestro siguiente bloque se encarga de crear un objeto de tipo SelectorFragment llamado selectorFragment el cual se encargara de asignarle el layout que contiene el fragment de la lista, despues tendremos un condicional para verificar si el objeto es igual a null, en caso de ser verdadero procedera a finalizarlo porque considera que no usando un fragment y si la modalidad anterior, en caso de tener un valor en el objeto selectorFragment llamara al metodo muestraLugar() para obtener el primer id y luego llamara a actualizaLista() para mostrar solamente el cambio de la lista y no cerrar la aplicacion, veamos las modificaciones en el siguiente video

Como pueden ver se realizo la eliminacion correctamente sin necesidad de modificar mucho nuestra aplicacion.

En resumen, hoy hemos tres modificaciones utiles y tambien de orden estetico en la aplicacion, hemos visto como simplificar el codigo para mostrar los actividades y fragmentos y no tener codigo redundante, hemos visto como lograr que nos traiga los datos del primer lugar por defecto, tambien hemos modificado a la hora de eliminar un elemento desde un fragmento evitando que nos traiga mayores inconvenientes como que se cierre la aplicacion, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios