2011-11-21 29 views
12

Tengo un Spinner con onItemSelected iteración que funciona, pero la forma en la especificación de la API dice:Spinner onItemSelected con objeto ya seleccionado

Esta devolución de llamada se invoca sólo cuando la posición recién seleccionado es diferente de la previamente seleccionado posición o si no había elemento seleccionado.

Necesito eliminar esta limitación y quiero que también se invoque la devolución de llamada si el usuario selecciona el mismo elemento. ¿Cómo hacer eso? Leí una sugerencia acerca de extender la clase de Spinner y establecer la posición en INVALID_POSITION, pero no he entendido/capaz de hacer eso. ¿Alguien hizo lo mismo?

+3

Desearía poder votar esta pregunta 1000 veces. Y desearía que hubiera una respuesta decente. He estado buscando durante horas para tratar de evitar esta estúpida limitación. – aaronsnoswell

+0

http://stackoverflow.com/a/11323043/2798289 – Govind

Respuesta

0

Puede hacerlo mediante un adaptador personalizado, como crear un diseño de sus vistas deseadas, luego inflar esto en un adaptador personalizado y luego en la función onItemClick puede obtener la vista mediante esta función.

Para distinguir cada vista, debe establecer la etiqueta de cada fila.

Probablemente funcione en su condición.

hacerme saber cualquier problema si usted tiene

-2

supongo que se debe a almacenar el valor de una variable, inicializar el vairable con -1. Y cambie el valor a medida que el usuario selecciona el elemento giratorio, si el valor es -1 solicite al usuario que vuelva a seleccionar o lo que desee.

@i quiero que se invoque la devolución de llamada también si el usuario selecciona el mismo elemento. Android lo hará por usted ya que este es el comportamiento predeterminado de Android.

+3

"Android lo hará por ti, ya que este es el comportamiento predeterminado de Android". Eso definitivamente NO es el comportamiento predeterminado. El valor predeterminado es (extrañamente), * NO * desencadenar el evento en absoluto, al hacer clic en una selección que ya está resaltada. – Carol

0

por qué tiene que volver a seleccionar el elemento seleccionado. Simplemente dé un botón de actualización si desea realizar esa tarea nuevamente.

+0

en mi caso, evito que el evento se active en el método Crear, luego mi direccionador se configura en el primer elemento. Si necesito seleccionarlo, no puedo con esta limitación. – jedi

0

Este es el elemento spinner con el modo de diálogo personalizado y whitout promt:

<Spinner 
    android:id="@+id/spinner_metatag" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/search_adv" 
/> 

El elemento de matriz en el que el valor predeterminado se putts en la posición 0:

<string-array name="search_adv"> 
    <item>@string/search_adv_prompt</item> 
    <item>@string/search_adv_title</item> 
    <item>@string/search_adv_desc</item> 
    <item>@string/search_adv_autore</item> 
    .... 
</string-array> 

Los elementos de cadena para la matriz con el valor predeterminado:

<string name="search_adv_prompt">Scegli un metatag</string> <!-- Default value--> 
<string name="search_adv_title">Titolo</string> 
<string name="search_adv_desc">Descrizione</string> 
<string name="search_adv_autore">Autore</string> 
... 

Y aquí el código para evitar el evento disparado en onCrea teMethod y el entorno para permitir seleccionar el mismo elemento ya seleccionado:

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

    spinner = (Spinner) findViewById(R.id.spinner_metatag); 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) { 
      //prevent onCreate event fire and the loop 
      if(pos==0) 
       return; 

      //HERE YOUR CODE 

      //at the end move to the default element the spinner 
      spinner.setSelection(0); 
     } 

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

Hope helps. La idea proviene de la segunda solución de TreKing's answer

0

Use OnItemClickListener en lugar de itemSelectedListener. Esto funcionará para cada clic, ya sea igual o diferente.

+3

Eso no funcionará en absoluto. Establecer un OnItemClickListener en Spinner arroja una excepción! –

+0

¿me puede decir qué excepción ...? – Athul

+2

http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) Es RuntimeException. –

1

También necesitaba una solución a este problema. Lo que quería hacer era tener un Spinner que tenga intervalos de fechas con una opción de rango personalizado.Las filas se vería algo como esto:

Abr 10 - 10 de mayo
03 10 hasta 04 10
febrero 10 a marzo 10
Serie personalizada

El problema es que si el usuario selecciona una costumbre rango y luego quiere cambiar su rango personalizado, tienen que seleccionar un rango diferente y luego seleccionar la opción de rango personalizado de nuevo. Quería que el usuario simplemente pudiera seleccionar "Rango personalizado" nuevamente para que el cuadro de diálogo de rango personalizado se pudiera mostrar nuevamente.

Subestimé a Spinner y creé mi propio oyente. El código cambia la selección, pero luego lo cambia inmediatamente para que no se seleccione nada. En mi oyente simplemente ignoro cualquier posición que sea menor que cero.

El Spinner solo muestra el último elemento seleccionado. Creé mi propio adaptador personalizado y especifico qué mostrar para cada vista, pero eso no debería ser necesario. Así es como clasifiqué a Spinner.

package com.example.widget; 

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

public class DateRangeSpinner extends Spinner { 

private ItemSelectionListener listener; 

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

/** 
* This listener will be fired every time an item is selected, 
* regardless of whether it has already been selected or not. 
* 
* @param l 
*/ 
public void setOnItemSelectedListener(ItemSelectionListener l) { 
    listener = l; 
} 

public void removeOnItemSelectedListener() { 
    listener = null; 
} 

@Override 
public void setSelection(int position) { 
    setSelection(position, true); 
} 

@Override 
public void setSelection(int position, boolean animate) { 
    if (listener != null) { 
     listener.onItemSelected(position); 
    } 
    super.setSelection(position, animate); 
    super.setSelection(-1, animate); 
} 

public interface ItemSelectionListener { 
    public void onItemSelected(int position); 
} 

} 

Espero que esto ayude!

Cuestiones relacionadas