Autore Topic: ListView non si aggiorna  (Letto 772 volte)

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
ListView non si aggiorna
« il: 21 Maggio 2011, 18:42:56 CEST »
0
Ciao a tutti!
Ho una ListView legata ad una tabella del database con questo adapter:
Codice (Java): [Seleziona]
adapter = new SimpleCursorAdapter(this, R.layout.row_event, c, new String[] { AppDB.eveName }, new int[] { R.id.eveName });
Praticamente quando vado a rimuovere un elemento non mi aggiorna la LV, nonostante abbia dato
Codice (Java): [Seleziona]
adapter.notifyDataSetChanged(); dopo aver fatto le mie modifiche...
Questo il mio codice:
Codice (Java): [Seleziona]
@Override
        public boolean onContextItemSelected(MenuItem item) {
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                                .getMenuInfo();
                switch (item.getItemId()) {
                case INFO_ID:
                        Toast.makeText(getApplicationContext(),
                                        "info.position=" + info.position, Toast.LENGTH_SHORT)
                                        .show();
                        return true;
                case EDIT_ID:
                        Toast.makeText(getApplicationContext(),
                                        "info.position=" + info.position, Toast.LENGTH_SHORT)
                                        .show();
                        return true;
                case DELETE_ID:
                        db.open();
                        db.deletEvent(info.position);
                        db.close();
                        adapter.notifyDataSetChanged();
                        return true;
                default:
                        return super.onContextItemSelected(item);
                }

Riuscite a capire perchè adapter.notifyDataSetChanged(); non dà l'effetto desiderato?
Grazie in anticipo ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView non si aggiorna
« Risposta #1 il: 21 Maggio 2011, 18:52:14 CEST »
0
Sei sicuro che l'elemento venga cancellato?
Comunque, se usi un SimpleCursorAdapter dovresti dare un c.requery()

PS: Non fare cross-posting

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:ListView non si aggiorna
« Risposta #2 il: 21 Maggio 2011, 19:09:05 CEST »
0
Sisi , l'elemento viene cancellato, infatti se rilancio l'applicazione non c'è più!
c.requery() è deprecato, quindo ho fatto
Codice (Java): [Seleziona]
case DELETE_ID:
                        db.open();
                        db.deletEvent(info.position+1);
                        Cursor cNew = db.fetchEvents();
                        adapter.changeCursor(cNew);
                        adapter.notifyDataSetChanged();
                        db.close();

che è lo stesso codice che c'è nel onResume  dell'Activity().Può andar bene, è concettualmente corretto?
 Ma pensavo: non c'è un modo per chiamare direttamente onResume()?

Un altra cosa importante: Se voglio ad esempio andare a eliminare il primo elemento della lista info.position mi restituisce 0, mentre nel database gli indici iniziano da 1, quindi mi ritrovo a eliminare il secondo elemento della lista.
Potrei fare info.position+1 però se un giorno decido di visualizzare gli elementi della LV in ordine alfabetico e non come sono gestiti dal database mi si incasina tutto!
Come posso risolvere? Cè un modo per recuperare l' id del database, non la posizione nella LV? Un po' come c'è in
Codice (Java): [Seleziona]
public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id)

Io non sono riuscito a trovarlo..
Spero possiate aiutarmi!  ;-) ciao!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView non si aggiorna
« Risposta #3 il: 21 Maggio 2011, 19:26:25 CEST »
0
c.requery() è deprecato, quindo ho fatto

L'hanno deprecato per fare in modo che la gente ottenga il nuovo cursore in modo asincrono, se devi farlo in modo sincrono tantovale chiami il requery()

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:ListView non si aggiorna
« Risposta #4 il: 21 Maggio 2011, 20:20:02 CEST »
0
Ma pensavo: non c'è un modo per chiamare direttamente onResume()?
Perché dovresti?

Citazione
Un altra cosa importante: Se voglio ad esempio andare a eliminare il primo elemento della lista info.position mi restituisce 0, mentre nel database gli indici iniziano da 1, quindi mi ritrovo a eliminare il secondo elemento della lista.
Perché usi position? Usa direttamente l'id no? Il cursor adapter imposta come id della riga l'id corrispondente nel database.
« Ultima modifica: 21 Maggio 2011, 20:23:04 CEST da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:ListView non si aggiorna
« Risposta #5 il: 22 Maggio 2011, 02:20:33 CEST »
0
Nel codice del metodo chiamato alla pressione prolungata su un item non c'è traccia dell'id... al massimo posso ricavare la posizione nella LV con info.positio()...
Dove dici che posso trovare l'id?

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:ListView non si aggiorna
« Risposta #6 il: 22 Maggio 2011, 03:03:45 CEST »
0
Nel codice del metodo chiamato alla pressione prolungata su un item non c'è traccia dell'id... al massimo posso ricavare la posizione nella LV con info.positio()...
Dove dici che posso trovare l'id?
che stupido che sono. ho usato info.id e tutto è andato a posto!  :-P
Codice (Java): [Seleziona]
case DELETE_ID:
                        db.open();
                        db.deletEvent(info.id);
                        Cursor cNew = db.fetchEvents();
                        adapter.changeCursor(cNew);
                        adapter.notifyDataSetChanged();
                        db.close();
                        return true;