viernes, 16 de agosto de 2019

Guardar ArrayList de Strings o ints en SharedPreferences

Hola, hoy creamos un método que guarde un ArrayList de Strings o números en las preferencias.
Necesitaremos:

1. Clase estática que contenga las constantes a utilizar.

Yo creé una clase que se llama GuardarPreferences, es necesario que sea estática porque la idea es que pueda se llamada desde cualquier parte de nuestra App con solo enviarle un contexto, pues las shared preferences requieren uno.

Las constantes indicarán qué tipo de campo quiero guardar, en este caso "NORMAS" significa que quiero guardar un número de norma x, podrían ponerle por ejemplo, NOMBRES, COLORES, o lo que ustedes quieran, más que nada es para identificar qué cosa voy a guardar.
la variable numeroDeNorma, es el valor a guardar.

El apartado de IDENTIFICADOR, no es más que un string para saber qué shared preferences abrirá, podrían poner el nombre de su paquete, o cualquier otra cosa que tenga sentido para ustedes.

Las preferences no pueden guardar ArrayList, pero sí un HashSet, por eso indicaba que podíamos guardar strings o enteros, porque podemos cambiarlos fácilmente.

En este ejemplo guardaré Strings, pero recibiré enteros, para demostrar la conversión.
El código completo:

public class GuardarPreferences {

    public static final String NORMA = "NORMAS";
    private static final String IDENTIFICADOR  = "Normas favoritas";
    public static void agregarAFavoritos(Context contexto, String campo, int numeroDeNorma){
        SharedPreferences preferencias = contexto.getSharedPreferences(IDENTIFICADOR,Context.MODE_PRIVATE);        SharedPreferences.Editor editor = preferencias.edit();
        ArrayList<String> normasFavoritas = new ArrayList<String>();
        if(campo.equals(NORMA)){
            normasFavoritas = new ArrayList<String>(preferencias.getStringSet(NORMA, new HashSet<String>()));            if(!normasFavoritas.contains(numeroDeNorma)) {
                normasFavoritas.add(numeroDeNorma + "");                editor.putStringSet(NORMA,new HashSet<String>(normasFavoritas));      editor.clear();
          editor.commit();            }
        }

    }

    public static void borrarFavoritos(Context contexto, String campo, int valor){
        SharedPreferences preferencias = contexto.getSharedPreferences(IDENTIFICADOR,Context.MODE_PRIVATE);        Set<String> normasFavoritas = preferencias.getStringSet(campo, new HashSet<String>());        normasFavoritas.remove(valor+"");        SharedPreferences.Editor editor = preferencias.edit();        editor.putStringSet(NORMA,new HashSet<String>(normasFavoritas));    editor.clear();
    editor.commit();    }

    public static ArrayList<Integer> getFavoritos(Context contexto, String campo){
        SharedPreferences preferencias = contexto.getSharedPreferences(IDENTIFICADOR,Context.MODE_PRIVATE);
        Set<String> normasFavoritas = preferencias.getStringSet(campo, new HashSet<String>());        ArrayList<Integer> normasFavoritas2 = new ArrayList<Integer>();        for(String normaGuardada:normasFavoritas){
            normasFavoritas2.add(Integer.parseInt(normaGuardada));        }
        return normasFavoritas2;    }

}

Para guardar otro dato, sólo tenemos que crear una constante nueva y agregarla al IF, por ejemplo para guardar nombres, podemos hacer un nuevo método igual, que en vez de recibir un int en numeroDeNorma, contenga String nombre, y nos ahorramos el casteo.

Usando los métodos desde una clase de tipo Activity:

GuardarPreferences.agregarAFavoritos(this,NORMA,15);GuardarPreferences.borrarFavoritos(this,NORMA,15);GuardarPreferences.getFavoritos(this,NORMA);

¡Recuerden siempre llamar a editor.clear();de lo contrario las preferencias se resetearán si la app se fuerza a cerrar o se reinicia el teléfono!

Espero que les sirva.
¡Saludos!

No hay comentarios:

Publicar un comentario