Autore Topic: Aggiornamento dati item di ListView  (Letto 1525 volte)

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Aggiornamento dati item di ListView
« il: 25 Novembre 2013, 13:09:58 CET »
0
Salve ragazzi,
ho un problema con una listView che mi sta facendo dannare alla grande. Al click della list apro una nuova activity che simula una custom dialog (mi dava problemi il fatto che non fossero bloccanti) in cui l'utente inserisce, tramite bottoni, un valore. Questo valore viene poi ripassato all'activity madre (cioè quella con la listview) che dovrebbe, attraverso l'onActivityResult(), mutare il campo dell'item che era stato cliccato.

Bene (anzi male), il tutto funziona, ma fino ad un certo punto x della lista. Vi spiego: l'aggiornamento del dato viene effettuato fino a un certo item (che sembra essere il terz'ultimo della lista) quando la lista contiene più elementi di quelli visualizzabili.

Esempio: lista1 ha 4 elementi, tutti visualizzati. In questo caso tutto funziona per il meglio.
lista2 ha 14 item. Tutto funziona correttamente fino all'undicesimo item. Dal dodicesimo in poi ho un bel "Null Pointer Exception" sulla riga di codice che richiama la textView della singola riga che voglio modificare.

Ecco a voi il codice interessato:

Codice (Java): [Seleziona]
 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==1000){
                Long idItem = data.getLongExtra("idItem", 0);
                String pid=data.getStringExtra("pid");
                return_value = data.getStringExtra("return_value");
                pos=data.getIntExtra("pos", 0);
                productsList = saveData.updateTemporaryProdottiCat(productsList, pid, return_value);
                ListView lv = getListView();
                int i = 0, trovato =0;
                do {
                        if (lv.getItemIdAtPosition(i)==idItem){
                                View view = lv.getChildAt(i);
                                String nome = ((TextView)view.findViewById(R.id.name)).getText().toString();
                        lblQty = (TextView)view.findViewById(R.id.number);
                        lblQty.setText(return_value);
                        trovato =-1;
                        }
                        i++;
                }while(i<lv.getCount() && trovato == 0);
        }
        else{
        }
    }


Ed ecco il LogCat
Codice: [Seleziona]
11-25 13:00:18.520: E/AndroidRuntime(12303): FATAL EXCEPTION: main
11-25 13:00:18.520: E/AndroidRuntime(12303): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1000, result=1000, data=Intent { cmp=xxxx (has extras) }} to activity {it.paradiso_giuseppe.cooking/it.paradiso_giuseppe.cooking.AllProducts_View}: java.lang.NullPointerException
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2992)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread.handleSendResult(ActivityThread.java:3035)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread.access$1100(ActivityThread.java:127)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1189)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.os.Looper.loop(Looper.java:137)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread.main(ActivityThread.java:4507)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at java.lang.reflect.Method.invokeNative(Native Method)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at java.lang.reflect.Method.invoke(Method.java:511)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at dalvik.system.NativeStart.main(Native Method)
11-25 13:00:18.520: E/AndroidRuntime(12303): Caused by: java.lang.NullPointerException
11-25 13:00:18.520: E/AndroidRuntime(12303):         at it.paradiso_giuseppe.cooking.AllProducts_View.onActivityResult(AllProducts_View.java:136)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.Activity.dispatchActivityResult(Activity.java:4653)
11-25 13:00:18.520: E/AndroidRuntime(12303):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2988)
11-25 13:00:18.520: E/AndroidRuntime(12303):         ... 11 more


PS: in questo esempio l'errore lo dà sulla riga che ho usato come "flag" (essa infatti viene letta, ma non modificata).
La riga 136 è
Codice (Java): [Seleziona]
String nome = ((TextView)view.findViewById(R.id.name)).getText().toString();
Come è possibile che funzioni solo fino a un certo punto? Eppure l'idItem è corretto e anche la posizione (controllo effettuato con il debug).

Non riesco a spiegarmelo .-. Qualcuno può aiutarmi?
Grazie infinite ;)

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #1 il: 25 Novembre 2013, 14:09:53 CET »
0
Prova a scomporlo su più righe e vedi quale parte del codice ti restituisce l'errore.

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Aggiornamento dati item di ListView
« Risposta #2 il: 25 Novembre 2013, 15:09:25 CET »
0
Quando ritorna all'activity precedente la riga cliccata è ancora visibile?
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:Aggiornamento dati item di ListView
« Risposta #3 il: 25 Novembre 2013, 15:25:55 CET »
0
Ho splittato in:

Codice (Java): [Seleziona]
TextView tvNome = (TextView)view.findViewById(R.id.name);
 String nome = tvNome.getText().toString();


la null pointer exception viene segnalata alla riga:
Codice (Java): [Seleziona]
TextView tvNome = (TextView)view.findViewById(R.id.name);
La riga selezionata è ancora visibile nella listView ;)

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #4 il: 25 Novembre 2013, 16:28:16 CET »
0
Prova a togliere quella stringa e vedere se anche
Codice (Java): [Seleziona]
lblQty = (TextView)view.findViewById(R.id.number); ti da errore. In quel caso potresti aver sbagliato
Codice (Java): [Seleziona]
View view = lv.getChildAt(i);

oppure aggiungi
Codice (Java): [Seleziona]
 Log.d("Valore di view: ", "view.toString()"); dopo 
Codice (Java): [Seleziona]
View view = lv.getChildAt(i);  e vedi che dice il Log
« Ultima modifica: 25 Novembre 2013, 16:36:18 CET da Paso »

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:Aggiornamento dati item di ListView
« Risposta #5 il: 25 Novembre 2013, 16:54:33 CET »
0
Eliminando quella riga il problema si ripresenta quando faccio

Codice (Java): [Seleziona]
lblQty = (TextView)view.findViewById(R.id.number);
Mettendo un breakpoint sul
Codice (Java): [Seleziona]
View view = lv.getChildAt(i);
ho notato come la View risulti a null. Ma questo non si spiega perchè risulta che l'indice i è uguale a lv.getCount()-1 (ergo sono ancora perfettamente in fase di ciclo). In più l'item esiste visto che lv.getItemIdAtPosition(i) ritorna l'effettivo valore dell'id di quell'item (infatti il controllo
Codice (Java): [Seleziona]
if (lv.getItemIdAtPosition(i)==idItem) viene superato con successo).


Come cavolo è possibile?!?!

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #6 il: 25 Novembre 2013, 17:09:41 CET »
0
Con la premessa che non sono minimamente esperto ne in android ne in java mi sembra che null corrisponda a int 0 quindi se lv.getItemIdAtPosition(i) ti restituisce null allora (lv.getItemIdAtPosition(i)==idItem) == true

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:Aggiornamento dati item di ListView
« Risposta #7 il: 25 Novembre 2013, 17:19:02 CET »
0
Null non corrisponde a nessun numero proprio perchè deve essere "esterno" a qualsiasi tipo di dato. Il controllo viene passato perchè il valore di ritorno di lv.getItemIdAtPosition(i) è uguale a idItem ;)

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #8 il: 25 Novembre 2013, 17:27:04 CET »
0
Allora non posso aiutarti oltre, anche perchè non so che faccia il metodo public long getItemIdAtPosition (int position) visto che la documentazione ufficiale non lo dice.
L'unica cosa che mi viene in mente è che la ListView sia vuota e quindi potrebbe ridarti valore 0. Prova a mettere Log ad ogni riga e vedere se c'è qualcosa che non quadra.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aggiornamento dati item di ListView
« Risposta #9 il: 25 Novembre 2013, 17:29:59 CET »
0
Dalla documentazione di ListView:

public int getCount ()

Added in API level 1
Returns
The number of items owned by the Adapter associated with this AdapterView. (This is the number of data items, which may be larger than the number of visible views.)

Quindi se lo usi come base per il ciclo può benissimo succedere che facendo lv.getChildAt(i) ti torni null, perché la vista per l'i-esimo item non è a schermo e quindi non ha nessuna view associata.

mi sembra che null corrisponda a int 0

Per cultura personale: in java (e quindi anche in android) null corrsponde solo ed esclusivamente a... null  :-)

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #10 il: 25 Novembre 2013, 17:38:58 CET »
0
Per cultura personale: in java (e quindi anche in android) null corrsponde solo ed esclusivamente a... null  :-)
Immaginavo di aver detto una cazzata! L'inesperienza si fa sentire!
Però sta cosa che hai scritto era venuta in mente anche a me.
Peppin: prova a dichiarare un sola volta la variabile ListView lv; all'inizio della classe e non sia in onCreate (credo tu l'abbia già dichiarato lì) sia in OnActivityResult!  E togli la stringa ListView lv = getListView();

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:Aggiornamento dati item di ListView
« Risposta #11 il: 25 Novembre 2013, 17:44:50 CET »
0
Nel caso specifico io ho questo trace:

- seleziono l'ultima riga (item) della lista
- si apre una activity che simula una dialog
- la dialog viene correttamente chiusa riportando nell'intent il valore che dovrò inserire

A questo punto la lista, non essendo stata toccata, reca l'ultima riga ancora visibile. E' questo che non mi spiego :O

Inoltre, come potrei fare a scorrermi l'intera lista modificando solo il valore che mi interessa?

Paso, la lv era ridichiarata lì per sicurezza, ma anche togliendo la getListView() non cambia nulla ;)

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:Aggiornamento dati item di ListView
« Risposta #12 il: 25 Novembre 2013, 17:50:24 CET »
0
Non ho ben capito il problema, ma io comunque mi fermo qua prima di sparare qualche c****ta troppo grossa. Sorry.

Offline Peppin2o

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 8.1 Pro x64
Re:Aggiornamento dati item di ListView
« Risposta #13 il: 25 Novembre 2013, 20:46:22 CET »
0
Se può essere utile a qualcun altro:

Ho risolto ricaricando completamente l'adapter nell'onActivityResult. Non sarà una soluzione elegante, ma funziona al 100% ;)