2012-01-10 11 views
6

Ho sprecato troppo tempo su questo, quindi devo chiedere ancora. Non ho idea del perché questo stia accadendo.Adapter Array notifyDataSetChanged() non funziona

Ho un adattatore di array (aAdapter) e un elenco di array (a lista) e sto cercando di mettere un pulsante di cancellazione per cancellare le voci in un database e cancellare l'elenco.

mio problema è che NotifyDataSetChanged() opera appena wont da dentro il mio metodo onlick qui:

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

} 

Funziona da ogni altra cosa però. Ho anche provato a mettere il clear e notifyDataSetChanged() in un altro metodo e chiamarlo ma non funziona, ma ha funzionato quando l'ho chiamato da onCreate ....

Qualche idea?

p.s. il database è stato cancellato.

+0

hai provato 'notifyDataSetInvalidated()' invece di 'notifyDataSetChanged()'? – edthethird

+0

Consiglio vivamente di utilizzare CursorAdapter se si dispone di un database. È magico! Non devi fare notifyDataSetChanaged(), semplicemente saprà che hai modificato il database e lo aggiorni da solo. – MinceMan

risposta

12

In primo luogo trovo l'implementazione dell'adattatore Android molto difettosa. Quando si tratta di eseguire qualsiasi cosa su misura, sembra che ci siano ambigui resoconti su come usarlo e la documentazione ufficiale non chiarisce nessuno di essi. Sarei molto felice di essere smentito con questo.

Il modo in cui ho ottenuto risultati coerenti durante la modifica dei dati nella vista è stato il seguente:

  • Tutte le modifiche alla struttura dati sottostante essere presentati dovrebbe essere fatto in un AsyncTask che ha senso come sei cose che cambiano sul thread UI e non voglio avere problemi di concorrenza.

  • Operazioni sulle strutture dati sottostanti deve essere eseguita chiamando i metodi di adattamento, quindi se avete un ListAdapter quindi si utilizza il add, remove e clear dell'adattatore lista. Ciò significa che l'adattatore gestisce le notifiche di visualizzazione, ecc. Questo generalmente porta a dover creare un adattatore personalizzato in quanto i metodi disponibili sono limitati (non c'è nemmeno un add in tutte le versioni di sdk prima di 7). Si finisce anche con il tuo adattatore che agisce come un grande fat controller, anche se sono consapevole che non dovremmo visualizzare Android come un pattern MVC che sembra ancora sbagliato.

  • Ho creato app in cui ignoro le chiamate all'adattatore per operare sulla struttura dati sottostante e ha funzionato in tutti i risultati finiti imprevedibili a meno che non si gestiscano strettamente le notifiche alla vista. Ora ho appena chiamato attraverso l'adattatore.

Quindi, anche se io non sono in grado di spiegare il motivo per cui in notifiyDataSetChanged non funziona specificamente nella vostra onClick metodo. Spero di fornire informazioni utili che potrebbero aiutarti a far funzionare la tua app come previsto.

+0

Grazie per tutte le informazioni, realizzerò sicuramente alcune delle tue idee. Sfortunatamente questo è per un incarico uni e io sto perdendo tempo mentre vado in vacanza domani quindi penso che proverò il suggerimento per i ciechi per ora. Tuttavia, lo pubblicherò sul mercato dopo che ho consegnato questo è così proverò alcune delle tue idee prima di allora. :) –

+2

Sono d'accordo, whatsthebeef !! Non uso più nemmeno specifiche "funzionalità documentate" perché non posso garantire che funzionino in ogni momento (anche in base alla documentazione fornita). In effetti, ho già avuto a che fare con il problema del porcospino e nemmeno io uso notifydatachanged(). :(Faccio solo i miei gestori di eventi. È davvero triste. ** Questo commento si riferisce specificamente agli adattatori Android, non all'SDK nel suo complesso ** –

9

Anche se non è bello, puoi semplicemente reinizializzare l'adattatore invece di notificarlo, ho visto che a volte è l'unico modo per farlo funzionare.

+0

Farò un tentativo, grazie. :) –

+1

Questo era anche l'unico modo in cui potevo farlo pulire. –

+0

Ho trovato la reinizializzazione dell'adattatore per essere l'unica soluzione che ha funzionato! grazie – Sahil

2

Quindi, un modo in cui ho gestito un problema simile a questo è fondamentalmente reinizializzare l'adattatore come detto accecamento.

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

Poi nel onclick Listener

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

L'esempio non hanno tutto inizializzato ma arriva al punto. Ho appena creato un nuovo adattatore e l'ho impostato sulla visualizzazione elenco che ho. Funziona bene.

0

Inoltre, si è verificato un comportamento strano dell'adapter, quando utilizzato nella finestra di dialogo. Una volta aggiornato l'adattatore (o struttura sottostante - in entrambi i modi) e la finestra di dialogo notifiyDataSetChanged scompare senza errori o altre tracce in LogCat o nel debug di Eclipse. Esattamente lo stesso codice, una volta che l'adattatore viene applicato all'attività normale (ListView) funziona perfettamente.

0

Credo che questa discussione non è più attivo, ma per riferimento futuro:

Secondo developer.android.com,

[onNotifyDataSetChanged()] Notifica gli osservatori allegate che i dati sottostanti è stato modificato e qualsiasi vista che riflette il set di dati dovrebbe aggiornarsi.

Invece di avere l'adattatore dire la vista di rinfrescarsi, basta aggiornare i dati utilizzando adapter.clear() e adapter.add() e poi forzare la ListView per aggiornare chiamando listView.setAdapter (adattatore) di nuovo .

Problemi correlati