Android: menú desplegable de Spinner con el elemento seleccionado en la posición superior

Tengo un problema con el Spinner en Android. Al seleccionar un elemento de la lista desplegable se ajustará el desplazamiento de esa lista desplegable la próxima vez que se abra. Por ejemplo, si elijo el elemento 100 en un menú desplegable de 500 elementos, la próxima vez que abra el menú desplegable, el elemento 100 estará en la parte superior de la lista. Este es el comportamiento que quiero.

Parece que hay un problema cuando combinar la funcionalidad de selector con llamar a setSelection(int) . Con los siguientes pasos parecen haber roto el sistema de offset en los hiladores desplegables.

  • Abra el Spinner y seleccione el segundo elemento.
  • Abra el Spinner de nuevo y esta vez lo rechaza sin seleccionar nada.
  • Llame a setSelection(int) en el Spinner con un valor mayor que 2.
  • Abra el Spinner una tercera vez. Tenga en cuenta que el desplazamiento es el mismo que en el paso 1.

He echado un vistazo al código en Spinner y AdapterView, pero no puedo ver nada de llamadas públicas que he perdido. ¿Se trata de un error en Spinner o un error en mi código?

Creo que puede resolver ese problema con el envío de lista a adaptador. Cuando un elemento seleccionado, ordene su lista y utilice la función notifyDataSetChanged () del adaptador. Cuando llamó a setSelection (int), vuelva a ordenar su lista y utilice la función notifyDataSetChanged ().

¿Has intentado public void setSelection (int position, boolean animate) ? No lo he probado, pero creo que pasar true como el segundo parámetro debe hacer que la lista se desplace hasta la posición seleccionada. La otra alternativa es calcular el desfase de desplazamiento (altura del artículo x posición del elemento seleccionado) y llamar a setDropDownVerticalOffset .

Actualización: He intentado modificar el ejemplo de Spinner en demostraciones de API para usar setSelection(7, true) y parece que funciona al seguir los 4 pasos que proporcionaste en tu pregunta. Acabo de agregar un showToast y modificado showToast siguiente manera:

 private final Handler handler = new Handler(); void showToast(CharSequence msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); handler.postDelayed(new Runnable(){ public void run() { Toast.makeText(Spinner1.this, "auto setting", Toast.LENGTH_SHORT).show(); Spinner s2 = (Spinner) findViewById(R.id.spinner2); s2.setSelection(7, true); } }, 5000); } 

He probado de la siguiente manera:

  1. Abrir el segundo hilandero y escoger "Venus" (la segunda selección).
  2. Abra el segundo hilandero y luego oprima para
  3. Después de 5 segundos, la llamada postDelayed hace que se seleccione 'Neptuno' (la séptima selección)
  4. Abra la ruleta y el offset es correcto
  • Hacer clic en el elemento giratorio dentro de la ventana emergente causa WindowManager $ BadTokenException
  • No se puede administrar a requestFocus a Spinner
  • Cómo crear editable spinner en android?
  • Creación de un menú desplegable desde un archivo .json
  • Crear un hilandero por programación android
  • ¿Cómo saber si se ha seleccionado un elemento giratorio en android?
  • ¿Cuál es la forma correcta de comunicarse desde una Vista personalizada a la Actividad en la que reside?
  • Alinear una ruleta subrayada en la misma línea junto al texto de edición
  • Android: cómo puedo obtener el tamaño de la matriz de cadena?
  • Eliminación del margen de la lista desplegable de hilanderos
  • Ocultar una hilera de carga al hacer clic fuera de ella en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.