Actualizar ListView

2,984 views
Skip to first unread message

Jc Miñarro

unread,
Dec 9, 2011, 12:40:04 PM12/9/11
to desarrollad...@googlegroups.com
Buenas Lista,

Estoy teniendo problemas al actualizar un ListView.
Os comento a ver si alguno de vosotros me puede echar un cable.

Resulta que tengo un ListView el cual relleno dinámicamente.
Para rellenarlo dinámicamente me he creado un objeto "adapter" de una clase que extiende de ArrayAdapter.
Y el arrayLIst que contiene este es de una clase que necesitaba para almacenar la
información necesaria.

La información a mostrar la consulto de una página web y voy añadiendo objetos de mi clase
al "adapter". Hasta aquí todo bien, incluso me muestra los datos bien en el listView.
El problema viene cuando decido actualizar esos datos. Porque dependiendo de una opción 
seleccionada en un "Spinner" debe mostrar los datos de un día en concreto.

Pues cuando cambio el día seleccionado en el "Spinner", en el método que llamo para actualizar
los datos del "adapter" lo primero que hago es:
adapter.clear();
Para que no se me dupliquen los datos.
Después voy añadiendo los diferentes objetos a mi adapter:
adapter.add(new ObjetoPropio(par1, par2, par3));

Y finálmente:
adapter.notifyDataSetChanged();
Para que me actualice el ListView.

Pues aquí viene el problema, el contenido que muestra la interface gráfica no se actualiza. Pero el 
contenido real del "adapter" si está modificado ya que al pulsar sobre alguno de los item de la lista
este me muestra en un alertDialog lo que debería de mostrar si se han cargado bien los datos.

Alguien sabe como puedo solucionar esto ¿?
Alguna idea ¿?


--
Un saludo,
Jc Miñarro

Jc Miñarro

unread,
Dec 10, 2011, 6:29:16 AM12/10/11
to desarrollad...@googlegroups.com
Al final lo he solucionado yo solo. XD

Resulta que tenía redefinido el método getView, el cual utilizaba un arraylist interno de la
clase que me había definido yo.
Como el método add del adapter lo había redefinido para que además de hacer lo que
tuviera que hacer añadiera el objeto en mi arraylist, pues he tenido que redefinir el metodo
clear para que además de hacer el clear del adapter haga un clear mi arraylist.

De esta forma al llamar al método notifyDataSetChanged del adapter que notifica al listview
y este llama al método getView del adapter, este coje los datos adecuados.

Muchas gracias de todas formas, pues aunque este fallo no me lo habéis resuelto he conseguido
arreglar y aprender mucho por medio de esta lista.

Juan de Dios Maldonado Sánchez

unread,
Dec 10, 2011, 6:52:23 AM12/10/11
to desarrollad...@googlegroups.com
Felicidades por resolverlo sólo. Tienes que entender que con las pistas que diste era humanamente imposible adivinar qué habías redefinido ese método.

2011/12/10 Jc Miñarro <josecarlo...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.



--
An'Brain - Prueba el nuevo widget inteligente para tu Android.
Idiotizer Free - Idiotiza a tus amigos. (Se requieren auriculares)
Track My App - Realiza un seguimiento de tus aplicaciones en el Android market.

Jc Miñarro

unread,
Dec 10, 2011, 7:30:57 AM12/10/11
to desarrollad...@googlegroups.com
Claro, el tema es que creía que el clear del adapter iba a realizar un clear del arraylist interno,
pero después de mucho probar caí en que la clase padre no tiene por qué saber que la 
clase hija tiene una variable arraylist... XD
Y ahí ya fue cuando caí.
Un saludo,
Jc Miñarro

David Sanchez Rodriguez

unread,
Aug 26, 2012, 9:48:34 AM8/26/12
to desarrollad...@googlegroups.com
Hola,

Tengo mas o menos el mismo problema que tenia JC.

Comento para entrar en situacion. Tengo una primera aactividad que me hace de login y me envia a la actividad que tiene el listview. Al entrar en la actividad del listview llamo a un servicio el cual se encarga de recoger los datos de un servidor y crearme una BD con los datos. Una vez tengo los datos, se crea una notificacion la cual al presionar sobre ella, me envia de nuevo a la actividad que esta la listview.

El caso es que la primera vez  que entro (o salgo y vuelvo a entrar) a la aplicacion no me muestra nada en el listview. En cambio, si recompilo la aplicacion y entro, entonces si me muestra la listview. Tambien esta el caso de que borre un elemento de la BD del telefono desde la aplicacion, y por lo tanto desaparece de los elementos que se debe de mostrar en la listview. Pero tan poco hace ese refresco.

Os pongo varios trozos de codigo, por ver donde pueda estar el fallo, ya que le he dado muchas vueltas y no veo nada. Esta listtview ha sido creada con un content provider hecho por mi, usando un baseAdapter.

Actividad que tiene el listview: Al principio lo tenia como invalidate() pero mirando y tambien me dijeron que es mejor cambiarlo por notifyDatasetchanged, pero ni aun asi se actualiza la vista de la lista.

ublic void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.listaincidencias);
mHandler = new Handler(this);
mapGUI();
trataEvents();
mProgress = new ProgressDialog(this);
mProgress.setTitle(getResources().getString(R.string.Loading));
mProgress.setMessage(getResources().getString(R.string.Loading_incidencias));
mProgress.setCancelable(false);
mProgress.show();
Thread t = new Thread(new Runnable(){

@Override
public void run() {
IncidenciaDataManager.Init(getContentResolver());
//Init el servicio cuando tengo todos los datos la base de datos
Intent intent = new Intent(ListarIncidenciasActivity.this, ServicioIncidencias.class);
startService(intent);
mHandler.sendMessage(mHandler.obtainMessage(INIT_ADAPTER));
}});
t.start();
}
@Override
public boolean handleMessage(Message msg) {
switch((Integer) msg.what){
case INIT_ADAPTER:
initAdapter();
if(mProgress != null){
mProgress.dismiss();
}
return true;
case REFRESH_ADAPTER:
refreshAdapter();
default:
break;
}
return false;
}
private void refreshAdapter(){
Vector<Incidencia> all = IncidenciaDataManager.getAll();
//Vector<Incidencia> filtered = new Vector<Incidencia>();
mAdapter.setList(all);
mAdapter.notifyDataSetChanged();
//list_incidencias.invalidate();
}
private void initAdapter(){
List<Incidencia> incidencias = IncidenciaDataManager.getRecents();
mAdapter = new IncidenciaAdapter(this, incidencias);

list_incidencias.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
//list_incidencias.invalidate();
}


Gracias

Saludos

David

2011/12/10 Jc Miñarro <josecarlo...@gmail.com>
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.



--
An'Brain - Prueba el nuevo widget inteligente para tu Android.
Idiotizer Free - Idiotiza a tus amigos. (Se requieren auriculares)
Track My App - Realiza un seguimiento de tus aplicaciones en el Android market.

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.

Gilberto Cuba Ricardo

unread,
Aug 26, 2012, 12:37:14 PM8/26/12
to desarrollad...@googlegroups.com
Bueno, por arribita y rápido.

Qué papel juega la notificación que tienes en todo esto. Supongo que
una vez logueado en dicha actividad, pasas a la otra actividad donde
tienes el listview, no? Si fuera así mi suposición, entonces te has
asegurado de que la BD se actualizó con los datos necesarios desde el
servicio?

Por lo demás, creeme, que con lo poco que has puesto de código y sin
formato, me pesa mucho mirarlo detenidamente.

Otro tip, poner algún que otro breakpoint e ir debugueando a ver qué pasa.

Siento no poder serte de más ayuda.


El 26/08/12, David Sanchez Rodriguez <das...@gmail.com> escribió:
> Hola,
>
> Tengo mas o menos el mismo problema que tenia JC.
>
> Comento para entrar en situacion. Tengo una primera aactividad que me hace
> de login y me envia a la actividad que tiene el listview. Al entrar en la
> actividad del listview llamo a un servicio el cual se encarga de recoger
> los datos de un servidor y crearme una BD con los datos. Una vez tengo los
> datos, se crea una notificacion la cual al presionar sobre ella, me envia
> de nuevo a la actividad que esta la listview.
>
> El caso es que la primera vez que entro (o salgo y vuelvo a entrar) a la
> aplicacion no me muestra nada en el listview. En cambio, si recompilo la
> aplicacion y entro, entonces si me muestra la listview. Tambien esta el
> caso de que borre un elemento de la BD del telefono desde la aplicacion, y
> por lo tanto desaparece de los elementos que se debe de mostrar en la
> listview. Pero tan poco hace ese refresco.
>
> Os pongo varios trozos de codigo, por ver donde pueda estar el fallo, ya
> que le he dado muchas vueltas y no veo nada. Esta listtview ha sido creada
> con un content provider hecho por mi, usando un baseAdapter.
>
> *Actividad que tiene el listview: *Al principio lo tenia como invalidate()
> pero mirando y tambien me dijeron que es mejor cambiarlo por
> notifyDatasetchanged, pero ni aun asi se actualiza la vista de la lista.
>
> *
> *
> Gracias
>
> Saludos
>
> David
> *
> *
>
> El sábado, 10 de diciembre de 2011 13:30:57 UTC+1, Jc Miñarro escribió:
>>
>> Claro, el tema es que creía que el clear del adapter iba a realizar un
>> clear del arraylist interno,
>> pero después de mucho probar caí en que la clase padre no tiene por qué
>> saber que la
>> clase hija tiene una variable arraylist... XD
>> Y ahí ya fue cuando caí.
>>
>> El 10 de diciembre de 2011 12:52, Juan de Dios Maldonado Sánchez <
>> jua...@gmail.com <javascript:>> escribió:
>>
>>> Felicidades por resolverlo sólo. Tienes que entender que con las pistas
>>> que diste era humanamente imposible adivinar qué habías redefinido ese
>>> método.
>>>
>>> 2011/12/10 Jc Miñarro <josecarlo...@gmail.com <javascript:>>
>>>
>>>> Al final lo he solucionado yo solo. XD
>>>>
>>>> Resulta que tenía redefinido el método getView, el cual utilizaba un
>>>> arraylist interno de la
>>>> clase que me había definido yo.
>>>> Como el método add del adapter lo había redefinido para que además de
>>>> hacer lo que
>>>> tuviera que hacer añadiera el objeto en mi arraylist, pues he tenido que
>>>>
>>>> redefinir el metodo
>>>> clear para que además de hacer el clear del adapter haga un clear mi
>>>> arraylist.
>>>>
>>>> De esta forma al llamar al método notifyDataSetChanged del adapter que
>>>> notifica al listview
>>>> y este llama al método getView del adapter, este coje los datos
>>>> adecuados.
>>>>
>>>> Muchas gracias de todas formas, pues aunque este fallo no me lo habéis
>>>> resuelto he conseguido
>>>> arreglar y aprender mucho por medio de esta lista.
>>>>
>>>> El 9 de diciembre de 2011 18:40, Jc Miñarro
>>>> <josecarlo...@gmail.com<javascript:>
>>>> desarrollad...@googlegroups.com <javascript:>.
>>>> Para anular tu suscripción a este grupo, envía un correo electrónico a
>>>> desarrolladores-a...@googlegroups.com <javascript:>
>>>> Para tener acceso a más opciones, visita el grupo en
>>>> http://groups.google.com/group/desarrolladores-android?hl=es.
>>>>
>>>
>>>
>>>
>>> --
>>> An'Brain<https://market.android.com/details?id=com.nidrico.apps.anbrain.lite>
>>> -
>>> Prueba el nuevo widget inteligente para tu Android.
>>> Idiotizer
>>> Free<https://market.android.com/details?id=com.nidrico.apps.idiotizerfree>-
>>> Idiotiza a tus amigos. (Se requieren auriculares)
>>> Track My
>>> App<https://market.android.com/details?id=com.nidrico.apps.trackmyapp>-
>>> Realiza un seguimiento de tus aplicaciones en el Android market.
>>>
>>> --
>>> Has recibido este mensaje porque estás suscrito al grupo
>>> "desarrolladores-android" de Grupos de Google.
>>> Para publicar una entrada en este grupo, envía un correo electrónico a
>>> desarrollad...@googlegroups.com <javascript:>.
>>> Para anular tu suscripción a este grupo, envía un correo electrónico a
>>> desarrolladores-a...@googlegroups.com <javascript:>
>>> Para tener acceso a más opciones, visita el grupo en
>>> http://groups.google.com/group/desarrolladores-android?hl=es.
>>>
>>
>>
>>
>> --
>> Un saludo,
>>
>> Jc Miñarro
>>
>>
>>
>
> --
> Has recibido este mensaje porque estás suscrito al grupo
> "desarrolladores-android" de Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> desarrollad...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> desarrolladores-a...@googlegroups.com
> Para ver este debate en la Web, visita
> https://groups.google.com/d/msg/desarrolladores-android/-/Q_vJzX5wgDcJ.
> Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
>
>
>


--
---
Saludos,
Gilberto Cuba

David Sanchez Rodriguez

unread,
Aug 26, 2012, 2:26:02 PM8/26/12
to desarrollad...@googlegroups.com
Hola Gilbert o ye l resto, 

La notificacion es tan solo para avisar de cuantos datos se han recibido y por lo tanto se han insertado nuevos en la base de datos, ya que luego el servicio se va ejecutando cada X tiempo y de este modo, notificara cuando nos llegue algun dato nuevo.

Si tengo datos en la BD y si que estan actualizados, ya que he estado con del debuger y si que se realizaban las inserciones con cada dato que me llegaba desde el servidor externo (estamos en el supuesto de que es la primera vez que ejecuto la aplicacion).

Se que el codigo no esta muy bien puesto, pero si lo copias y pegas en tu editor de texto, supongo que lo podras ver y leer mejor, ya que el codigo que puse es todo el que se utiliza (lo unico que me falto poner de codigo es el relacionado con las opciones del menu y cuando se hace clic sobre un elemento de la lista).

Incluso, cuando estaba haciendo el debug, me puse los breakpoints en el BaseAdapter que me he creado y pasaba por donde toca.

Gracias

Saludos
David Sanchez Rodriguez

Twitter: @dasanro

Gilberto Cuba Ricardo

unread,
Aug 26, 2012, 4:25:33 PM8/26/12
to desarrollad...@googlegroups.com
Lo único que se me ocurre, y que no tiene mucho sentido tampoco, es
que el servicio no esté refrescando los mensajes, y por ende, no se
llame al método refreshAdapter().

De otra forma, no sé qué pudiera ser. Lo siento.

Yo tu pusiera un montón de Logs,inundaría el código de ellos, para
descubrir el funcionamiento que está teniendo la actividad. Por
ejemplo: me pondría uno al inicio del run() del Thread, otro en el
handleMessage() con el valor de msg.what, de forma tal que supiera qué
está llegando ahí, y bueno, pondría otros en otras partes que no veo
:P, como son el BaseAdapter que creaste y quién sabe si también en el
ContentProvider.

Luego de esto estaría muy atento al Logcat junto que voy cacharreando
mi aplicación e inyectándole valores para que actualice el servicio.

Ya nos contarás, y ojalá esto te de alguna luz.
> Twitter: @dasanro <https://twitter.com/#!/dasanro>
> Facebook: www.facebook.com/dasanro
>
> --
> Has recibido este mensaje porque estás suscrito al grupo
> "desarrolladores-android" de Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> desarrollad...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> desarrolladores-a...@googlegroups.com
> Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
>
>
>


--
---
Saludos,
Gilberto Cuba

David Sanchez Rodriguez

unread,
Aug 27, 2012, 12:29:59 PM8/27/12
to desarrollad...@googlegroups.com
Hola,

Finalmente se soluciono, pues a pesar de que los datos se cogian de la BD y se cargaban en una lista, luego no se le estaban añadiendo al listview cuando se inicializaban las variables, por lo que toco forzar de nuevo la carga de datos.

Gracias

Saludos
Reply all
Reply to author
Forward
0 new messages