Desplegable en Android que permite multi-selecciones

Tiempo estimado de lectura: 2 min.

Quizá alguna vez te haya ocurrido que tienes un desplegable en Android y te gustaría poder escoger de nuevo la misma opción seleccionada, para así lanzar de nuevo los eventos tras élla sin que éllo suponga escoger otra opción y cambiar de nuevo.

En mi caso, uso varios objectos spinner que tienen opciones de fecha: un día, una semana, un mes, entre dos fechas determinadas… es en este último caso, en el que cuando la seleccionas se solicitan las dos fechas, en el que esta solución cobraría sentido (volver a hacer otra búsqueda nueva con fechas diferentes).

¿Ocurre algo parecido en tu proyecto?

Android SelectAgain Spinner

Famosa es la frase de “no me hagas pensar”, y al final la usabilidad lo es todo, élla marca la diferencia entre un proyecto exitoso y un fracaso total…

Desgraciadamente, por diseño, los widgets spinner de Android no permiten hacer eso, pero casi todo en esta vida tiene solución. No te preocupes, si quieres sigue leyendo y te ayudo a corregirlo.

Esta es la clase que hace la magia:

package com.saulcintero.example.ui.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;

public class SelectAgainSpinner extends Spinner {
    private int lastSelected = 1;

    public SelectAgainSpinner(Context context) {
        super(context);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        if(this.lastSelected == this.getSelectedItemPosition() && getOnItemSelectedListener() != null)
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), this.getSelectedItemPosition(), getSelectedItemId());

        if(!changed)
            lastSelected = this.getSelectedItemPosition();

        super.onLayout(changed, l, t, r, b);
    }
}

Y ahora, desde nuestra clase, usaremos SelectAgainSpinner. Primero la importamos:

import com.saulcintero.example.ui.widgets.SelectAgainSpinner;

Después la declaramos:

private SelectAgainSpinner spinner1;

Y por último la usamos (añáde este código al método onCreate):


spinner1 = (SelectAgainSpinner) findViewById(R.id.spinner1);
String[] choiceTimeList = new String[] { "Todo el rango de fechas", "Este año", "Este mes", "Esta semana", "Delimitado entre fechas" };
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, choiceTimeList);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(spinnerArrayAdapter);
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        showData();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

Finalmente, que no se te olvide añadirla a tu layout:


<com.saulcintero.example.ui.widgets.SelectAgainSpinner
    android:id="@+id/spinner1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

¡Que lo disfrutes! ¡Yeah! 🙂 .

Saúl Cintero.

Publicado por

Saúl Cintero

Saúl Cintero

Soy feliz diseñando y desarrollando soluciones para cada necesidad.En los últimos tiempos he centrado mi atención en Java y disfruto desarrollando productos tanto para escritorio como para dispositivos móviles.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit is exhausted. Please reload CAPTCHA.