Autore Topic: Refresh di una ListView  (Letto 1444 volte)

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Refresh di una ListView
« il: 23 Marzo 2011, 03:36:58 CET »
0
Ciao a tutti! Mi sono imbattuto in una problematica particolare. Premetto che ho trovato una soluzione estremamente "spartana" ed è proprio di questo che volevo discutere.

Il problema è questo: ho una ListView costruita su un SimpleCursorAdapter che a sua volta genera gli items prendendo i dati da un db SQLite. In un'Activity ho un pulsante che risponde all'onClick in questo modo:

Codice (Java): [Seleziona]
delete.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                dropTable();
                                Toast.makeText(getApplicationContext(),
                                                                "All Notes Deleted!",
                                                                Toast.LENGTH_LONG).show();
                                refreshList();
                        }
                });

con un execSQL teso a cancellare tutti i dati nella relativa tabella:

Codice (Java): [Seleziona]
protected void dropTable() {
                // TODO Auto-generated method stub
                SQLiteDatabase db = sqlite.getWritableDatabase();
                db.execSQL("DELETE FROM 'noteTable'");
        }

E fin qui tutto ok...

Il problema sorge subito dopo aver cancellato i dati: la ListView non si aggiorna e continua a mostrare gli items presenti prima della cancellazione:-o

Quello che vi chiedo è: "Esiste un metodo pulito e diretto per effettuare il refresh della ListView"? Specifico "pulito" e "diretto" perché il modo io l'ho trovato ovvero:

Codice (Java): [Seleziona]
protected void refreshList() {
                // TODO Auto-generated method stub
                this.onCreate(null);
        }

Ma sinceramente non mi convince per niente; a naso mi sembra una specie di forzatura... :-\
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Refresh di una ListView
« Risposta #1 il: 24 Marzo 2011, 17:48:17 CET »
0
Avrei gradito anche un "SEI UN IMBECILLE, non si fa così"! :D
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Refresh di una ListView
« Risposta #2 il: 24 Marzo 2011, 18:17:38 CET »
0
Il codice postato è un po' poco (almeno per me) e meno è il codice e più difficile è comprendere le cose... questa è una delle ragioni per cui chi potrebbe rispondere rimanda a quando ha più tempo da dedicarci.  :-P

Comunque, in generale per aggiornare una ListView io uso la funzione dell'adapter:
Codice (Java): [Seleziona]
public void notifyDataSetChanged ()Notifies the attached View that the underlying data has been changed and it should refresh itself.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Refresh di una ListView
« Risposta #3 il: 25 Marzo 2011, 00:35:28 CET »
0
Bradipao, c'ho provato ma richiamando quel metodo la lista comunque non viene aggiornata... :( Per quanto riguarda la quantità di codice postata sinceramente non so cos'altro può essere utile, se non postare il codice di tutta l'Activity (che ahimé non ho ancora provveduto a commentare  :-[ ), sperando che possa essere "leggibile" (questa versione NON INCLUDE il codice di bradipao):
Codice (Java): [Seleziona]
public class ListNotes extends Activity {

        private Button delete;
        private ListView list;
        private MySQLiteHelper sqlite;
        private final static String[] COL = { "_id", "title" };
        private final static String[] SELECTED_TITLE = { "title" };
        private final static int[] ITEM_RES = { R.id.itemText };
        private AlertDialog alertShow;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.listnotes);

                delete = (Button) findViewById(R.id.dropBT);
                sqlite = new MySQLiteHelper(getApplicationContext());
                SQLiteDatabase db = sqlite.getReadableDatabase();
                Cursor ris = db.query("noteTable", COL, null, null, null, null,
                                "_id DESC");

                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                                R.layout.itemlist, ris, SELECTED_TITLE, ITEM_RES);

                list = (ListView) findViewById(R.id.listView);
                list.setAdapter(adapter);
                list.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                                // TODO Auto-generated method stub
                                Intent intent = new Intent();
                                intent.putExtra("id", (int) arg3);
                                ListNotes.this.setResult(RESULT_OK, intent);
                                ListNotes.this.finish();
                        }
                });

                registerForContextMenu(list);

                alertShow = setupAlertDialog(this.getResources());

                delete.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                alertShow.show();
                        }
                });
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                super.onCreateContextMenu(menu, v, menuInfo);
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.contextlist, menu);
        }

        @Override
        public boolean onContextItemSelected(MenuItem item) {
                // TODO Auto-generated method stub
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                                .getMenuInfo();
                switch (item.getItemId()) {
                case R.id.deleteMenu:
                        deleteItem(info.id);
                        return true;
                default:
                        return super.onContextItemSelected(item);
                }
        }

        private void deleteItem(long id) {
                // TODO Auto-generated method stub
                SQLiteDatabase db = sqlite.getWritableDatabase();
                db.execSQL("DELETE FROM 'noteTable' WHERE _id = " + id);
                refreshList();
        }

        protected void refreshList() {
                // TODO Auto-generated method stub
                this.onCreate(null);
        }

        protected void dropTable() {
                // TODO Auto-generated method stub
                SQLiteDatabase db = sqlite.getWritableDatabase();
                db.execSQL("DELETE FROM 'noteTable'");
        }

        protected AlertDialog setupAlertDialog(Resources res) {
                String title = res.getString(R.string.alert_title);
                String message = res.getString(R.string.alertdialog_message);
                String yesBT = res.getString(R.string.alertdialog_yes);
                String noBT = res.getString(R.string.alertdialog_no);
                final String textToast = res.getString(R.string.toast_notesdeleted);
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
                alertDialog
                                .setTitle(title)
                                .setMessage(message)
                                .setCancelable(true)
                                .setNegativeButton(noBT, new DialogInterface.OnClickListener() {

                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                                // TODO Auto-generated method stub
                                                dialog.cancel();
                                        }
                                })
                                .setPositiveButton(yesBT,
                                                new DialogInterface.OnClickListener() {

                                                        @Override
                                                        public void onClick(DialogInterface dialog,
                                                                        int which) {
                                                                // TODO Auto-generated method stub
                                                                ListNotes.this.dropTable();
                                                                Toast.makeText(getApplicationContext(),
                                                                                textToast, Toast.LENGTH_LONG).show();
                                                                ListNotes.this.refreshList();
                                                        }
                                                });

                return alertDialog.create();
        }

}

« Ultima modifica: 25 Marzo 2011, 00:37:36 CET da gGx »
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re: Refresh di una ListView
« Risposta #4 il: 25 Marzo 2011, 13:55:02 CET »
+1
Devi fare nel metodo un ris.requery ed un adapter.notifydatachanged

Sent from my GT-I9000 using Tapatalk

Offline EmilioCuomo

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab 10.1v
  • Sistema operativo:
    Windows
Re:Refresh di una ListView
« Risposta #5 il: 29 Agosto 2011, 14:22:30 CEST »
0
Sucsami ho lo stesso problema, hai risolto te?

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Refresh di una ListView
« Risposta #6 il: 03 Settembre 2011, 00:43:23 CEST »
0
Sucsami ho lo stesso problema, hai risolto te?

Scusami se non ti ho risposto prima. Comunque sì, io ho risolto con un requery() sul Cursor seguito da un notifyDataSetChanged() sul relativo Adapter.
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker