2012-01-10 24 views
6

he estado perdiendo demasiado tiempo en esto por lo que tienen que pedir de nuevo. No tengo idea de por qué sucede esto.matriz adaptador notifyDataSetChanged() no funcionará

Tengo un adaptador de matriz (aAdapter) y una lista de matriz (aList) y estoy tratando de poner un botón para borrar las entradas en una base de datos y borrar la lista.

Mi problema es que NotifyDataSetChanged() el trabajo apenas no desde el interior de mi método onlick aquí:

public void clearDB(View view) { 
    aList.clear(); 
    aAdapter.notifyDataSetChanged(); 
    HighScoresDB hsdb = new HighScoresDB(HighScoresActivity.this); 
    hsdb.openDB(); 
    hsdb.clearDB(); 
    hsdb.closeDB(); 

} 

Funciona de cualquier otro lugar sin embargo. Incluso he intentado poner el clear y notifyDataSetChanged() en otro método y llamarlo pero eso tampoco funciona, pero funcionó cuando lo llamé desde onCreate ...

¿Alguna idea?

p.s. la base de datos está siendo limpiada

+0

¿Ha intentado 'notifyDataSetInvalidated()' en lugar de 'notifyDataSetChanged()'? – edthethird

+0

Recomiendo usar CursorAdapter si tiene una base de datos. ¡Es mágico! No tiene que notificar aDataSetChanaged() solo sabrá que ha realizado un cambio en la base de datos y la ha actualizado por sí mismo. – MinceMan

Respuesta

12

En primer lugar me parece la implementación del adaptador Android muy deficiente. Cuando se trata de realizar algo personalizado, parece que hay cuentas ambiguas sobre cómo usarlo y la documentación oficial no aclara ninguna de ellas. Estaría muy feliz de haber demostrado estar equivocado con esto.

La forma en que me dieron resultados consistentes cuando los datos de edición en la vista fue la siguiente:

  • Todos los cambios en la estructura de datos subyacente que se presenta se debe hacer en un AsyncTask lo cual tiene sentido ya que están cambiando las cosas en la UI Thread y no quiero tener problemas de simultaneidad.

  • Las operaciones en las estructuras de datos subyacentes deben realizarse llamando a los métodos de adaptador por lo que si usted tiene un ListAdapter continuación, se utiliza el add, remove y clear del adaptador lista. Esto significa que el adaptador logra ver notificaciones, etc. En general, esto conduce a tener que crear un adaptador de costumbre como los métodos disponibles son limitadas (que no es ni siquiera un complemento todo en las versiones de SDK antes de las 7). También termina con su adaptador actúa como un gran fat controller, aunque soy consciente de que no deberíamos estar viendo androide como un patrón MVC todavía parece mal.

  • He creado aplicaciones en las que eludir llamadas de adaptador para operar en la estructura de datos subyacente y ha funcionado hasta que los resultados terminaron siendo impredecibles a menos que haya administrado estrictamente las notificaciones a la vista. Ahora solo llamo a través del adaptador.

Así que aunque yo no sea capaz de explicar por qué en notifiyDataSetChanged no trabajar específicamente en su onClick Método. Es de esperar que proporcione información útil que pueda ayudarlo a hacer que su aplicación funcione como se espera.

+0

Gracias por toda la información, definitivamente implementaré algunas de sus ideas. Lamentablemente, esto es para una asignación uni y me estoy quedando sin tiempo, ya que voy a ir de vacaciones mañana, así que creo que voy a intentar la sugerencia de los ciegos por ahora. Sin embargo, voy a publicar esto en el mercado después de que haya entregado esto, así que probaré algunas de sus ideas antes de eso. :) –

+2

Estoy de acuerdo, whatsthebeef !! Ni siquiera uso una "funcionalidad documentada" específica porque no puedo garantizar que funcionen en todo momento (incluso dada la documentación provista). De hecho, me he encontrado con el problema del puerco espín antes y ni siquiera uso notifydatachanged() tampoco. :(Solo hago mis propios controladores de eventos. Es triste, realmente. ** Este comentario se refiere específicamente a los adaptadores de Android, no al SDK en general ** –

9

Si bien no es bonito, sólo puede reinicializar el adaptador en lugar de notificar que, he visto que a veces es la única manera de hacer que funcione.

+0

Voy a intentar esto, gracias. :) –

+1

Esta fue también la única forma en que pude conseguir que se limpiara a sí mismo. –

+0

¡Encontré la reinicialización del adaptador como la única solución que funcionó! gracias – Sahil

2

Así que una manera en que manejé un problema similar a esto es básicamente para reiniciar el adaptador como blindstuff dijo.

public class Example extends Activity{ 
     CustomAdapter adapter; 
     ArrayList<ArrayList<String>> info = new ArrayList<ArrayList<String>>(); 
     final ListView list = (ListView) findViewById(R.id.listView_custom); 
     adapter = new CustomAdapter(this, diceInfo.get(id)); 
     list.setAdapter(adapter); 

A continuación, en el oyente onclick

add.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       info.get(id).add("1,0,0,true"); 
       adapter = new CustomAdapter(Example.this, info.get(id)); 
       list.setAdapter(adapter); 
      } 
     }); 

El ejemplo no se ha inicializado todo pero se vuelve al punto. Solo hago un nuevo adaptador y lo configuro para la vista de lista que tengo. Funciona bien.

0

También se ejecutó en el comportamiento extraño del adaptador, cuando se utiliza en el cuadro de diálogo. Una vez que se actualiza el adaptador (o la estructura subyacente - en ambos sentidos) y el diálogo notifiyDataSetChanged desaparece sin error u otro rastro en LogCat o la depuración de Eclipse. Exactamente el mismo código, una vez que se aplica el adaptador a la actividad normal (ListView) funciona bien.

0

supongo que este hilo ya no está activa, pero para referencia futura:

Según developer.android.com,

[onNotifyDataSetChanged()] notifica a los observadores adjuntos que los datos subyacentes se ha cambiado y cualquier Vista que refleje el conjunto de datos debería actualizarse.

En lugar de tener el adaptador de contar la vista para refrescar en sí, sólo actualizar los datos utilizando adapter.clear() y adapter.add() y luego forzar el ListView para actualizar llamando listView.setAdapter (adaptador) de nuevo .

Cuestiones relacionadas