2010-07-19 25 views
13

He estado intentando actualizar mi spinner en Android dinámicamente pero nada de lo que intento ha funcionado.¿Cómo actualizar un girador dinámicamente?

Este es el siguiente código que estoy usando para actualizar la ruleta.

typeList = dbAdapter.getList(); //array list with the values 

adapter.notifyDataSetChanged(); 
groupSpinner.postInvalidate(); 
groupSpinner.setAdapter(adapter); 

Los valores de typeList son correctos pero no se actualizan en el Spinner.

+0

I fi Esto se acaba de crear con un adaptador completamente nuevo ... Sin embargo, creo que no debería haber tenido que hacer eso. – 2Real

+0

Tiene una instancia de adaptador. si inicializa su adaptador de nuevo notifyDataSetChanged no funciona. – user1154390

Respuesta

3

¿Hay un error tipográfico o algo así? Cuál es la diferencia entre dbAdapter y adapter. Si el Spinner ya tiene el adaptador, no es necesario volver a asignarlo. Además, lo único que tienes que hacer es actualizar el adaptador y llamar al método notifyDataSetChanged.

typeList = adapter.getList(); //array list with the values 
// change the values, and then 
adapter.notifyDataSetChanged(); 
+0

dbAdapter es mi enlace al adaptador de base de datos es un adaptador personalizado que hice que amplía BaseAdapter e implementa SpinnerAdapter. Intenté lo que sugeriste y eso no funcionó. – 2Real

10

Sólo tiene que llamar setAdapter() una vez y te llaman adapter.notifyDataSetChanged() para actualizar los datos.

+0

¿Necesito crear un adaptador completamente nuevo porque eso no funciona? Cuando hago clic en el control giratorio, los valores en la lista no se actualizan. – 2Real

+12

He encontrado 'NotifyDataSetChanger()' para trabajar en listas, pero no lo he visto funcionar en Spinners. Supongo que hay una diferencia interna que requiere que crees un nuevo adaptador cada vez. –

18

En realidad, tiene que llamar a borrar/agregar el adaptador, o crear y establecer un nuevo adaptador. El adaptador no conserva una referencia a su lista (solo está llamando a Array en su lista en la construcción), por lo que no hay forma de que se actualice solo.

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList); 
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinnerCategory.setAdapter(dataAdapter); 
7

Cuando se tiene datos modificados en su lista y cuando se quiere actualizar la ruleta entonces

crear un nuevo objeto del adaptador y establece que el adaptador a la spinner. Funcionará seguro.

Lo mejor de la suerte.

Editar: También necesita llamar a notifyDataSetChanged() en el adaptador.

1

Cambie los datos subyacentes y llame al notifyDataSetChanged() en el adaptador.

list.clear(); 
    list.add("A"); 
     list.add("B"); 
    dataAdapter.notifyDataSetChanged(); 
1

Después de cambiar los datos, se tendrá que añadir el siguiente código:

typeList = dbAdapter.getList()    
adapter = new ArrayAdapter<String>(v.getContext(), 
    android.R.layout.simple_spinner_dropdown_item,typeList);    
groupSpinner.setAdapter(adapter); 
0

Al parecer, después de hacer typeList = dbAdapter.getList(), los typeList variable apunta a una lista diferente en lugar de la persona que alimenta a el adaptador originalmente y el adaptador estarían algo confundidos.

lo que debe utilizar el siguiente código:

typeList.clear(); 
typeList.addAll(dbAdapter.getList()); 
0

Al configurar el adaptador spinner añadir

spinnerAdapter.setNotifyOnChange(true); 

A partir de entonces cuando se agrega nuevos datos se actualizará automáticamente.

+0

Para ArrayAdapter, el valor predeterminado ya es verdadero. Para usar con Spinners, hacer esto no tiene ningún efecto, como se menciona en los comentarios de respuestas anteriores. –

2

No puede simplemente modificar el List original y luego llamar al notifyDataSetChanged() como en otros adaptadores, ya que no se aferra al original List.Sin embargo, se puede lograr el mismo resultado utilizando el adaptador en sí, así:

spinnerAdapter.clear(); 
spinnerAdapter.addAll(updatedListData); 
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default 

Sobre la base de una respuesta de user392117 (https://stackoverflow.com/a/38738734/1508887)

+0

Esto debería ser una respuesta aceptada. – Smeet

0

El uso de añadir/eliminar en el adaptador y el uso de notifyDataSetChanged() le permite no tener que crear nuevos adaptadores una y otra vez.

Declarar su adaptador mundial

ArrayAdapter<Object> adapter; 

Cuando se agrega algo a la lista de objetos del adaptador está unido a (Cadenas o cualquier objeto que usa) agrega una función de complemento al adaptador y llama notifyDataSetChanged:

adaper.add(Object); 
adapter.notifyDataSetChanged(); 

y cuando se quita un elemento de la Lista añadir también:

adapter.remove(Object); 
adapter.notifyDataSetChanged(); 
Cuestiones relacionadas