android - scanner - Ejemplo de notifyDataSetChanged
listview bluetooth android example (5)
Estoy intentando usar en mi Android Application
el método notifyDataSetChanged()
para un ArrayAdapter
pero no funciona para mí.
Encontré como respuesta aquí , que notifyDataSetChanged()
debería ejecutarse en el hilo principal, pero no había ningún ejemplo para eso.
¿Alguien podría enviar un ejemplo o al menos un enlace?
Para un ArrayAdapter
, notifyDataSetChanged
solo funciona si usa add()
, insert()
, remove()
y clear()
en el Adaptador.
Cuando se construye un ArrayAdapter
, contiene la referencia para la List
que se pasó. Si pasara una List
que era miembro de una Actividad, y cambiara ese miembro de la Actividad más adelante, el ArrayAdapter
todavía tiene una referencia al List
original. El adaptador no sabe que cambió la List
en la actividad.
Tus elecciones son:
- Use las funciones de
ArrayAdapter
para modificar la Lista subyacente (add()
,insert()
,remove()
,clear()
, etc.) - Vuelva a crear el
ArrayAdapter
con la nuevaList
datos. (Utiliza muchos recursos y recolección de basura). - Cree su propia clase derivada de
BaseAdapter
yListAdapter
que permita cambiar la estructura de datos de laList
subyacente. - Use
notifyDataSetChanged()
cada vez que se actualice la lista. Para llamarlo en UI-Thread, userunOnUiThread()
deActivity
. Luego,notifyDataSetChanged()
funcionará.
Puede usar el método runOnUiThread()
siguiente manera. Si no está utilizando una ListActivity
, simplemente adapte el código para obtener una referencia a su ArrayAdapter
.
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
Recientemente escribí sobre este tema, aunque esta publicación es antigua, pensé que sería útil para alguien que quiera saber cómo implementar BaseAdapter.notifyDataSetChanged()
paso a paso y de manera correcta.
Siga cómo implementar correctamente BaseAdapter.notifyDataSetChanged () en Android o en el blog más nuevo BaseAdapter.notifyDataSetChanged () .
Sé que esta es una respuesta tardía, pero me enfrentaba a un problema similar y logré resolverlo utilizando notifyDataSetChanged()
en el lugar correcto.
Entonces mi situación fue la siguiente.
Tuve que actualizar una vista de lista en una pestaña de la barra de acciones (fragmento) con los contenidos devueltos de una actividad completamente diferente. Inicialmente, sin embargo, la vista de lista no reflejaría ningún cambio. Sin embargo, cuando hice clic en otra pestaña y luego regresé a la pestaña deseada, la vista de lista se actualizaría con el contenido correcto de la otra actividad. Entonces, para resolver esto, utilicé notifyDataSetChanged()
del adaptador de barra de acciones en el código de la actividad que tenía que devolver los datos.
Este es el fragmento de código que utilicé en la actividad.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.action_new_forward:
FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
Intent ina = new Intent(getApplicationContext(), MainActivity.class);
ina.putExtra("stra", values1);
startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
}
}
Esta actividad devolvería algunos datos a FragmentTab2
y actualizaría directamente mi vista de lista en FragmentTab2
.
¡Espero que alguien encuentre esto útil!
Tuve el mismo problema y prefiero no reemplazar todo el ArrayAdapter con una nueva instancia continuamente. Por lo tanto, tengo el AdapterHelper hacer el trabajo pesado en otro lugar.
Agregue esto donde normalmente llamaría (intentaría) notificar
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();
Clase de AdapterHelper
public class AdapterHelper {
@SuppressWarnings({ "rawtypes", "unchecked" })
public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
arrayAdapter.clear();
for (Object object : listOfObject){
arrayAdapter.add(object);
}
}
}