2012-02-21 21 views
13

tengo ArrayAdapter con esta estructura artículos:artículos ArrayAdapter androide actualizar

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout ... > 

     <TextView 
      android:id="@+id/itemTextView" 
      ... /> 
</RelativeLayout> 

y añadir adaptador para:

mAdapter = new ArrayAdapter<String>(this, R.layout.item, 
              R.id.itemTextView, itemsText); 

Todo está bien, pero quiero actualizar texto de los elementos de adaptador. Encontré una solución

mAdapter.notifyDataSetChanged(); 

pero no entiendo cómo usarla. Ayuda por favor.

UPD Mi código:

String[] itemsText = {"123", "345", "567"}; 
ArrayAdapter<String> mAdapter; 

onCreate

mAdapter = new ArrayAdapter<String>(this, R.layout.roomitem, 
               R.id.itemTextView, itemsText); 
setListAdapter(mAdapter); 
itemsText = {"789", "910", "1011"}; 

onClick

mAdapter.notifyDataSetChanged(); 
//it's dont work 

Respuesta

34

creo que algo como esto

public void updatedData(List itemsArrayList) { 

    mAdapter.clear(); 

    if (itemsArrayList != null){ 

     for (Object object : itemsArrayList) { 

      mAdapter.insert(object, mAdapter.getCount()); 
     } 
    } 

    mAdapter.notifyDataSetChanged(); 

} 
+4

No es necesario añadir elementos al adaptador, simplemente llame notifyDataSetChanged vez que haya terminado el trabajo en el ArrayList – barry

+1

llamo notifyDataSetChanged pero no pasa nada – Leo

+0

¿qué haces en el onclick, o el método donde u cambiar algo en los itemsText? – Luciano

4

Suponiendo itemTexts como Array cadena o cuerda ArrayList, donde se está añadiendo nuevos elementos en itemsTextat ese tiempo después que puede llamar al

mAdapter.notifyDataSetChanged(); 

Si no recibió respuesta, por favor ponga un código.

35

Su problema es un error de Java típica con punteros.

En un primer paso está creando una matriz y pasando esta matriz al adaptador.

En el segundo paso está creando una nueva matriz (para que se cree un nuevo puntero) con nueva información, pero el adaptador aún apunta a la matriz original.

// init itemsText var and pass to the adapter 
String[] itemsText = {"123", "345", "567"}; 
mAdapter = new ArrayAdapter<String>(..., itemsText); 

//ERROR HERE: itemsText variable will point to a new array instance 
itemsText = {"789", "910", "1011"}; 

lo tanto, puede hacer dos cosas, uno, actualizar los contenidos de la matriz en lugar de crear una nueva:

//This will work for your example 
items[0]="123"; 
items[1]="345"; 
items[2]="567"; 

... o lo que iba a hacer, usar una lista, algo así como :

List<String> items= new ArrayList<String>(3); 
boundedDevices.add("123"); 
boundedDevices.add("456"); 
boundedDevices.add("789"); 

Y en la actualización:

boundedDevices.set("789"); 
boundedDevices.set("910"); 
boundedDevices.set("1011"); 

Para añadir más información, en una aplicación real normalmente se actualizan los contenidos del adaptador de la lista con la información de un servicio o proveedor de contenido, por lo que normalmente para actualizar los elementos que haría algo como:

//clear the actual results 
items.clear() 

//add the results coming from a service 
items.addAll(serviceResults); 

con esto borrará los resultados anteriores y cargará los nuevos (piense que los nuevos resultados deberían tener una cantidad diferente de elementos).

Y fuera de curso después de actualizar los datos la llamada al notifyDataSetChanged();

Si tiene alguna duda, no dude en comentar.

+0

¡Encore! Muy bueno y bien explicado. – Tim

+0

Estoy usando fragmentos.He hecho todos los pasos anteriores.Pero, mi arrayadapter no se está actualizando.Cualquier consejo –

+2

Ponga un ejemplo, por favor. –

Cuestiones relacionadas