studio scanner por example enviar ejemplo dispositivos datos connectedthread buscar android android-arrayadapter notifydatasetchanged

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:

  1. Use las funciones de ArrayAdapter para modificar la Lista subyacente ( add() , insert() , remove() , clear() , etc.)
  2. Vuelva a crear el ArrayAdapter con la nueva List datos. (Utiliza muchos recursos y recolección de basura).
  3. Cree su propia clase derivada de BaseAdapter y ListAdapter que permita cambiar la estructura de datos de la List subyacente.
  4. Use notifyDataSetChanged() cada vez que se actualice la lista. Para llamarlo en UI-Thread, use runOnUiThread() de Activity . 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(); } });



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); } } }