Desarrollando una app en Android Studio desde 0: #2 Filtros con Spinners

Cómo bien expliqué en la primera entrada de esta serie de entradas, esta aplicación se utilizará para conocer a otras personas con los mismos pensamientos que tú, esto se consigue gracias a los filtros.

Los filtros puedes ser más o menos, más complicados o menos, pero acaban siendo lo mismo, una serie de datos que te define cómo persona y que (en esta aplicación) te ayudan a filtrar a los usuarios para mostrarte únicamente los que tienen algo en común contigo.

Estos datos se guardarán en la base de datos y se relacionarán con la tabla de usuarios mediante el ID del usuario.

PHP

Al igual que el registro, el crear un filtro es lo mismo que hacer un insert en la BD, por lo que podemos utilizar el código del registro para crear un nuevo php con una nueva consulta que recoja los filtros que le indiquemos y los inserte en la BD.

Activity

Esta Activity constará de una serie de spinners a la que añadiremos el contenido a seleccionar desde el java de la activity, además, le he añadido unos fragments views para darle un toque más estético:

Java

Para no hacer la entrada eterna, explicaré nada más que dos cosas:

  • Spinner básico
  • Spinner con datos de la BD

Spinner Básico

Los Spinners son una lista desplegable de la cual podemos seleccionar un elemento y usarlo después.

Para llenar dichos spinners, utilizaremos ArrayList que definiremos anteriormente:

ArrayList <String> Es = new ArrayList<>();

Es.add("Pública");
Es.add("Privada");
Es.add("Concertada");

Al ser pocos elementos los que hay que añadir al Spinner, los podemos añadir directamente en el código a través de un ArrayList.

Una vez creado dicho ArrayList, deberemos crear un adaptador y aplicarlo al spinner:

ArrayAdapter adpEs = new ArrayAdapter(Filtros.this,android.R.layout.simple_spinner_dropdown_item,Es);
spinnerEs.setAdapter(adpEs);

Y una vez aplicado el adaptador, debemos poner el Spinner en modo escucha para que cuando pulsemos un elemento, guarde el texto del mismo en una variable que definamos:

spinnerEs.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String ele = (String) spinnerEs.getAdapter().getItem(i);
                SEs = ele;
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

Spinner con datos de la BD

Ahora por fin sabéis para qué es la tabla de «Ciudades» de la base de datos. Con un PHP deberemos ejecutar un SELECT cogiendo el nombre de las ciudades:

<?php
include 'connexio.php';

$sentencia = $conexion->prepare("SELECT nombreCiudad FROM `ciudades`");
$sentencia->execute();

$resultado = $sentencia->get_result();

while ($columna = mysqli_fetch_array($resultado)){
        echo $columna[0].'#';
}
$sentencia->close();
$conexion-> close();

?>

Y este SELECT lo ejecutaremos y procesaremos su respuesta con la siguiente función:

public void listarCiudades(String URL)
    {

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                if(!response.isEmpty()){ //si hi ha resposta

                    ciudades = response.split("#");

                    for (int i = 0; i < ciudades.length; i++){
                        nombreCiudad.add(ciudades[i]);
                        //Toast.makeText(Filtros.this, numCiudades.get(i),Toast.LENGTH_SHORT).show();
                    }


                    ArrayAdapter adpCiudades = new ArrayAdapter(Filtros.this, android.R.layout.simple_spinner_dropdown_item, nombreCiudad);

                    spinnerCiudades.setAdapter(adpCiudades);

                    spinnerCiudades.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                        @Override
                        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                            String ele = (String) spinnerCiudades.getAdapter().getItem(position);

                            for (int i = 0; i < nombreCiudad.size(); i++){
                                if (nombreCiudad.get(i).equals(ele)){
                                    idCiudad = String.valueOf(i+1);
                                }
                            }

                        }

                        @Override
                        public void onNothingSelected(AdapterView<?> adapterView) {

                        }
                    });


                }else{

                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {


                String message = null;
                if (volleyError instanceof NetworkError) {
                    message = "No se puede conectar a Internet... ¡Compruebe su conexión!";
                } else if (volleyError instanceof ServerError) {
                    message = "No se pudo encontrar el servidor. Por favor, inténtalo de nuevo después de un tiempo.";
                    volleyError.printStackTrace(System.out);
                } else if (volleyError instanceof AuthFailureError) {
                    message = "No se puede conectar a Internet... ¡Compruebe su conexión!";
                } else if (volleyError instanceof ParseError) {
                    message = "¡Error de sintáxis! Por favor, inténtalo de nuevo después de un tiempo.";
                } else if (volleyError instanceof NoConnectionError) {
                    message = "No se puede conectar a Internet... ¡Compruebe su conexión!";
                } else if (volleyError instanceof TimeoutError) {
                    message = "¡El tiempo de conexión expiro! Por favor revise su conexion a internet.";
                }
                Toast.makeText(Filtros.this,message,Toast.LENGTH_SHORT).show();


            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> parametros = new HashMap<>();

                return parametros;

            }
        };

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest); 
    }

Primero, se añade toda la respuesta en una tabla (ciudades) y se separa los valores gracias a los #. Una vez añadido todo, se crea un bucle for con el tamaño de la tabla y se van añadiendo todos los valores a un ArrayList.

Una vez tenemos generado el ArrayList, al igual que con el Spinner simple, se genera un adaptador y se añade.

Y esta vez, una vez tengamos seleccionado un elemento, le indicamos que nos guarde la posición de dicho valor, ya que en la BD la tabla es un int. Al estar ordenado de la misma manera, podremos no tendremos problema.

Al igual que con el registro, una vez tengamos todos los valores definidos en variables, los podemos añadir cómo parámetros en una nueva función que llamará a otro archivo PHP para hacer el insert en la BD.

Además, para que el usuario tan solo tenga una sola fila de Filtros, podemos hacer que borre la fila anterior del mismo usuario antes de crear la nueva:

$sentencia = $conexion->prepare("DELETE FROM filtros WHERE `IDUsuario` = ?");
$sentencia->bind_param('s',$IDUsuario);
¡Sígueme y comparte en tus redes!

Deja un comentario

Twitter
Visit Us
Follow Me
INSTAGRAM