Autore Topic: Aggiornamento ListView - Problema su notifyDataSetChanged()  (Letto 399 volte)

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Aggiornamento ListView - Problema su notifyDataSetChanged()
« il: 30 Marzo 2016, 17:14:58 CEST »
0
Ciao a tutti,
sto creando una listview seguendo questa guida.
A differenza della guida nella mia listview popolo la lista dinamicamente con dei dati recuperati dal database MySQL, inoltre ho aggiunto un ImageButton che chiama un metodo per modificare i dati all'interno del database.
A questo punto dovrei aggiornare la listview con i nuovi dati, ma non riesco. Leggendo in diversi forum suggeriscono di usare notifyDataSetChanged() nell'adapter, ho provato ad aggiungerlo al mio codice ma non aggiorna la listview.

Vi allego parte del codice:

MainActivity.java

Codice (Java): [Seleziona]
public void listSetup() {
    CustomList adapter = new
            CustomList(MainActivity.this, x_list, y_list,z_list, u);
    list = (ListView) findViewById(R.id.list);
    list.setAdapter(adapter);
adapter.notifyDataSetChanged();
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            Toast.makeText(MainActivity.this, "You Clicked at " + x_list[+position], Toast.LENGTH_SHORT).show();
        }
    });
}

CustomList.java

Codice (Java): [Seleziona]
public View getView(final int position, View view,  ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    final View rowView= inflater.inflate(R.layout.list_single, null, true);
    ImageButton x_button = (ImageButton)rowView.findViewById(R.id.x_button);
    [...]
    x_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            myFunction(position); //call the php page
        }
    });
    return rowView;
}

Post unito: [time]31 Marzo 2016, 10:46:13 CEST[/time]
« Ultima modifica: 31 Marzo 2016, 10:46:57 CEST da Fixxxer393, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #1 il: 31 Marzo 2016, 15:29:27 CEST »
0
All'ArrayAdapter devi fornire i dati su cui lavorare.
Solo dopo aver aggiornato questi dati puoi chiamare notifyDataSetChanged per aggiornare la ListView.
Inoltre ti consiglio di utilizzare il pattern ViewHolder nell'Adapter della ListView.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #2 il: 31 Marzo 2016, 15:34:27 CEST »
0
All'ArrayAdapter devi fornire i dati su cui lavorare.
Solo dopo aver aggiornato questi dati puoi chiamare notifyDataSetChanged per aggiornare la ListView.
Inoltre ti consiglio di utilizzare il pattern ViewHolder nell'Adapter della ListView.

per la prima cosa che mi hai suggerito ho già cambiato in questo modo:

Codice (Java): [Seleziona]
CustomList adapter = new CustomList(this, R.layout.list_single, list);
il fatto problema è che la classe dove ho il listener per il button che cambia i dati nel database, cioè CustomList.java non ha il riferimento diretto alla lista creata inizialemnte.
Non so se sono stato chiaro, non è facile da spiegare, eventualmente ti posto il codice.

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #3 il: 31 Marzo 2016, 15:44:24 CEST »
0
All'ArrayAdapter devi passare i dati che la ListView deve visualizzare,  ad es. un reference ad una List di oggetti contenenti i dati.
Quando modifichi tale List anche l'Adapter utilizzerà la List modificata, perché hai passato un reference.
Quindi chiami notifyDataSetChanged per aggiornare la ListView.
Questo è solo un esempio.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #4 il: 31 Marzo 2016, 15:56:55 CEST »
0
All'ArrayAdapter devi passare i dati che la ListView deve visualizzare,  ad es. un reference ad una List di oggetti contenenti i dati.

la variabile list contiene i dati che devo visualizzare. E' stata creata dinamicamenti dai dati recuperati dal database. Nel momento in cui clicco sul button interno alla ListView e che è stato dichiarato all'interno della classe dell'adapter, vado a cambiare solamente i dati nel database MySQL e non direttamente della lista, cioè:

CustomList.java
Codice (Java): [Seleziona]
 ImageButton x_button = (ImageButton)convertView.findViewById(R.id.x_button);
        x_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                myFunction();//funzione per cambiare i dati nel database
                notifyDataSetChanged();
            }
        });

Poi nella classe MainAcrivity.java ho un metodo per settare la listview, cioè:

Codice (Java): [Seleziona]
   
 public void listSetup() {
        ListView listView = (ListView)findViewById(R.id.list);
        CustomList adapter = new CustomList(this, R.layout.list_single, list);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

questo metodo lo richiamo appena ho finito di popolare la list con i miei dati recuperati dal database.

Fammi sapere se ci sono errori nel codice oppure se sto sbagliando qualcosa logicamente.

Ti ringrazio  ;-)

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #5 il: 31 Marzo 2016, 17:35:32 CEST »
0
Dal codice che hai postato list è il reference alla ListView, ma forse l'hai cambiato dopo?

Cmq una volta che aggiorni il database devi ovviamente ripopolare la lista che hai passato all'adapter e quindi chiamare notifyDataSetChanged().

PS. Il database è locale? In questo caso forse sarebbe meglio utilizzare un CursorAdapter...

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #6 il: 31 Marzo 2016, 17:40:14 CEST »
0
Dal codice che hai postato list è il reference alla ListView, ma forse l'hai cambiato dopo?

list è anche il nome della lista

Codice (Java): [Seleziona]
   List list = new LinkedList();
Cmq una volta che aggiorni il database devi ovviamente ripopolare la lista che hai passato all'adapter e quindi chiamare notifyDataSetChanged().

notifyDataSetChanged()
lo faccio appena richiamo la funzione che aggiorna il db

PS. Il database è locale? In questo caso forse sarebbe meglio utilizzare un CursorAdapter...

E' un database mysql remoto

Non so più cosa fare sinceramente, se hai altri suggerimenti ti ringrazio.

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #7 il: 31 Marzo 2016, 17:43:04 CEST »
+1
notifyDataSetChanged()[/i] lo faccio appena richiamo la funzione che aggiorna il db

Oltre ad aggiornare il db remoto devi anche aggiornare la list che hai passato all'adapter, altrimenti l'adapter continua ad utilizzare la vecchia lista, e solo dopo aver aggiornato la list chiamare notifyDataSetChanged.
« Ultima modifica: 31 Marzo 2016, 17:45:21 CEST da iClaude »

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #8 il: 31 Marzo 2016, 17:48:52 CEST »
0
Oltre ad aggiornare il db remoto devi anche aggiornare la list che hai passato all'adapter, altrimenti l'adapter continua ad utilizzare la vecchia lista, e solo dopo aver aggiornato la list chiamare notifyDataSetChanged.

Ma dovrei aggiornarla dalla classe Adapter dove non ho piu un riferimento diretto alla lista, come posso fare?

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #9 il: 31 Marzo 2016, 19:05:56 CEST »
0
Ma dovrei aggiornarla dalla classe Adapter dove non ho piu un riferimento diretto alla lista, come posso fare?

Nella classe adapter hai un riferimento alla lista.
Cmq è difficile capire il problema senza vedere tutto il codice.

Offline Fixxxer393

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 10
Re:Aggiornamento ListView - Problema su notifyDataSetChanged()
« Risposta #10 il: 01 Aprile 2016, 09:42:01 CEST »
0
Ho risolto recuperando il riferimento alla lista e cambiandone la struttura
Codice (Java): [Seleziona]
list.remove(posizione); prima di richiamare notifyDataSetChanged(), grazie per l'aiuto!