2010-07-22 16 views
8

¿Es posible actualizar un Adaptador simple? Tengo una lista de datos y un pie de página que dice "Ver próximos resultados". Cuando se hace clic en ese elemento de la lista, captura el evento y obtengo nuevos datos. Luego quiero reemplazar los datos en el ListView con estos nuevos datos, pero no puedo encontrar la manera de hacerlo. ¿Algunas ideas? No quiero usar un ArrayAdapter, porque por lo que puedo ver, los elementos solo pueden contener una cadena donde la necesito para contener varias cadenas y entradas.Cómo actualizar SimpleAdapter en Android

Respuesta

10

Actualización: Según del116, que de hecho puede dar SimpleAdapter un mapa mutable y luego llamar manualmente el método del adaptador notifyDataSetChanged cuando se necesita la lista para actualizar. Sin embargo, mi punto a continuación se refiere a la documentación de SimpleAdapter especificando que es para datos estáticos; usarlo para datos variables va en contra de su diseño, así que si usa esta técnica, me aseguraré de verificar si continúa funcionando en las nuevas versiones de Android a medida que aparecen.

(comentario original sigue :)

Si nos fijamos en la SimpleAdapter description que dice que es "un adaptador fácil de mapear los datos estáticos a las vistas definidas en un archivo XML." He añadido el énfasis: simplemente, SimpleAdapater no está diseñado para usarse con datos que cambian; maneja solo datos estáticos. Si no puede usar un ArrayAdapter porque sus datos tienen más de un bit de texto, entonces tendrá que crear su propio ListAdapter personalizado, o poner sus datos en un DB y usar uno de los CursorAdapter s.

Como último recurso, si usted no necesita mucho el rendimiento, podría actualizar un ListView respaldado por una SimpleAdapter mediante la construcción de una nueva instancia SimpleAdapter cualquier momento cambios en sus datos y decir la vista de lista para usarla a través setListAdapter.

+4

Su respuesta aquí es realmente engañosa. Después de actualizar los datos de la matriz y llamar a notifyDataSetChanged() en mi SimpleAdapter, pude actualizar el simpleAdapter. No es necesario usar ArrayAdapter para llamar a notifyDataSetChanged(). – dell116

+1

@ dell116 Bastante justo. Me referí a esa posibilidad al final de mi respuesta, pero la he promovido a la cima en base a tus comentarios de que de hecho funciona; No lo había probado. Sigo manteniendo que hacer tal cosa merece cierta precaución ya que la documentación de SimpleAdapter establece específicamente que es para datos estáticos. –

+0

Mirando hacia atrás en esto ahora ... wow. No sabía nada sobre programación o el propósito previsto de SimpleAdapter. Si usa un ListView (o cualquier AdapterView) respaldado por una estructura de datos que cambiará, no use SimpleAdapter. Foot.inMouth (verdadero); – dell116

2

SimpleAdapter es para datos estáticos, por lo que su rendimiento puede variar. La mejor solución es, probablemente, cambiar a un tipo diferente de adaptador, como ArrayAdapter, o crear un nuevo SimpleAdapter cada vez que cambie el conjunto de datos.

3
ListView lv= (ListView) findViewById(R.id.loglist); 
ArrayList<Map<String, String>> list = buildData(); 
String[] from = { "time", "message" }; 
int[] to = { R.id.logtime, R.id.logmessage }; 

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to); 
lv.setAdapter(adapter); 

Llame esta función cada vez para actualizar el ListView. Tenga en cuenta que usted tiene que actualizar la variable de lista con nuevos datos ..

espero que esta ayuda .. :)

0

yo no era capaz de conseguir notifyDataSetChanged() para trabajar en la actualización de mi SimpleAdapter, por lo en lugar de eso intentado quitar primero todos los puntos de vista que se adjuntan a la disposición de los padres usando removeAllViews(), a continuación, añadir el ListView, y que trabajaba, permitirme actualizar la interfaz de usuario:

LinearLayout results = (LinearLayout)findViewById(R.id.results); 
ListView lv = new ListView(this); 
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.directory_row, 
        new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept }); 

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("dept", dept); 
    list.add(map); 
} 

lv.setAdapter(adapter); 
results.removeAllViews();  
results.addView(lv); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

usar esta línea después de actualizar datos en los datos Lista de HashMap

+0

lea la documentación, no es posible en SimpleAdapter como se indicó anteriormente SimpleAdapter no destinado para tales acciones. – Manny265

Cuestiones relacionadas