Autore Topic: ListView riempita da SimplyCursorAdapter.....refresh post databb change  (Letto 365 volte)

Offline jd4smart

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s
  • Sistema operativo:
    Win7
Salve a tutti
vengo a porvi una piccola questione:


Come da titolo ho avuto la necessità di visualizzare i risultati di una qualche operazione che erano stati salvati da un'altra parte dell'applicazione in un db.
Leggendo un po e qua su listview e adapter vari ho optato poi per estendere la classe "simpleCursoAdapter" in modo da poter dare un mio layout personalizzato alla visualizzazione.

Dire che il tutto funziona come ci si aspetta....o per lo meno in fase di apertura.....in soldoni La listview è riempita correttamente
Le parti significative del codice sono

Codice (Java): [Seleziona]
                        cursor= _dbAdapter.fetchData(PipelineMyCase.TBL_RESULT_myCASE1,
                                new String[] { "_ID as _id" , PipelineMyCase.FLD_TIMESTAMP, PipelineMyCase.FLD_MOTION, PipelineMyCase.FLD_LIGHT, PipelineMyCase.FLD_NOISE, PipelineMyCase.FLD_VERIFIED },
                                null, null);

                        adapter= new myCursorAdapter (this, R.layout.single_row_view, cursor,
                                new String[] { PipelineMyCase.FLD_TIMESTAMP, PipelineMyCase.FLD_MOTION, PipelineMyCase.FLD_LIGHT, PipelineMyCase.FLD_NOISE, PipelineMyCase.FLD_VERIFIED },
                                        new int [] { R.id.timestamp, R.id.motion, R.id.light, R.id.noise, R.id.verified });

                        listView= (ListView) findViewById(android.R.id.list);
                        listView.setAdapter(adapter);

Ovviamente la classe myCursorAdapter non fa altro che ridefinire i metodi "newView" "bindView" per far si che le varie text del layout siano riempite con i dati corretti.
Codice (Java): [Seleziona]
                @Override
                public View newView(Context context, Cursor cursor, ViewGroup parent) {
                        View retView= _layoutInflater.inflate(_layout, parent, false);
                        return retView;
                }

                @Override
                public void bindView(View view, Context context, Cursor cursor) {
                  ......  
                  // banalissimi cursor.getString sulle oppportune colonne del db
                  .....
                }

Ora però, il problema arriva quando tramite activity che visualizza appunto i risultati vado ad aggiornare eventuali valori nel DB tramite opportuna query sql.

Per la modifica delle singole voci, ho predisposto un "setOnItemLongClickListener" che va ad aprire un Alertdialog riassuntivo, con ovviamente i 2 bottoni che permettono di confermare o meno la validità della linea editata.

Tutta la procedura va ad aggiornare correttamente la relativa entry nel db...ma non ho trovato alcun modo "elegante" di riaggiornare la listview post aggiornamento db se non quello di istanziare un nuovo cursor e un nuovo adapter e witchare alla listview queste nuove variabili. (il tutto per evitare di usare l'api deprecata cursor.requery())

Ovviamente essendo per ora il db piccolo, non c'è nessna ripercussione prestazionale, ma visto che il db potrebbe diventare parecchio grande.....andare a richiedere un nuovo cursor e un nuovo adapter per aggiornare la listview relativa ritengo non sia la soluzione ottimale!

Se ho ben compreso poi, non posso nemmeno utilizzare la notifyDataSetChanged() (che ovviamente non produce alcun effetto)
in quanto è pensata per adpater che lavorano su array di string!

Quello che servirebbe a me, sarebbe implementare qualche observer al cursor (e quindi di conseguenza al database)
e se non ho letto male dalle api la cosa sarebbe anche disponibile

Codice (Java): [Seleziona]
                        cursor.registerDataSetObserver(new DataSetObserver() {

                                        @Override
                                        public void onChanged() {
                                                super.onChanged();
                                        }
                                });
Però anche con questa soluzione non si ha il risultato sperato!


Qualche consiglio?
(escluso ovviamente il creare un content provider che esporti il db in questione e utlizzare i cursor loader.)