Autore Topic: Accedere a View dentro ad un ListItem non visualizzato?  (Letto 944 volte)

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Accedere a View dentro ad un ListItem non visualizzato?
« il: 13 Agosto 2012, 12:32:25 CEST »
0
Ciao a tutti,
ho la mia ListView con ListItem personalizzati.
Ogni ListItem ha al suo interno una ImageView.
Voglio fare un ciclo che mi renda tutte queste ImageView invisibili.
Come posso fare?
Il codice, che funziona solo per i ListItem visibili, è questo:
Codice (Java): [Seleziona]
        public void resetNumDaTrovare() {
                ImageView imvNelCarrello = null;
            for(int i = 0; i < iNumProd; i++) {
                Prodotto p = items.get(i);
                p.setbNelCarrello(false);

                View v = (View)ListaSpesa.livProdotti.getChildAt(i);
               
                imvNelCarrello = (ImageView)v.findViewById(R.id.imvNelCarrello);
                imvNelCarrello.setVisibility(View.INVISIBLE);
               
                        // Aggiornamento prodotto nella tabella
                        SQLiteDatabase myDB = appContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
                        String sSql = "UPDATE listeSpesaProdotti SET NelCarrello = 0 WHERE IdProd = " + p.getiIdProd() + ";";
                    myDB.execSQL(sSql);
                        myDB.close();
            }
            setiNumDaTrovare(iNumProd);
       }

Quando invece ho tanti elementi, che necessitano di uno scroll per essere visti, al primo elemento non visualizzato nel mio output, ecco l'eccezione (scatenata dalla riga "View v = (View)ListaSpesa.livProdotti.getChildAt(i);" che ritorna null):
Codice: [Seleziona]
08-13 12:29:17.724: E/AndroidRuntime(3559): FATAL EXCEPTION: main
08-13 12:29:17.724: E/AndroidRuntime(3559): java.lang.NullPointerException
08-13 12:29:17.724: E/AndroidRuntime(3559):         at com.fedrasoft.trackall.CustomListAdapter.resetNumDaTrovare(CustomListAdapter.java:157)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at com.fedrasoft.trackall.ListaSpesa$3.onClick(ListaSpesa.java:157)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.view.View.performClick(View.java:2532)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.view.View$PerformClick.run(View.java:9293)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.os.Handler.handleCallback(Handler.java:587)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.os.Handler.dispatchMessage(Handler.java:92)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.os.Looper.loop(Looper.java:150)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at android.app.ActivityThread.main(ActivityThread.java:4277)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at java.lang.reflect.Method.invokeNative(Native Method)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at java.lang.reflect.Method.invoke(Method.java:507)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-13 12:29:17.724: E/AndroidRuntime(3559):         at dalvik.system.NativeStart.main(Native Method)

Ho già spulciato diverse discussioni in rete senza trovar soluzione...  :-(

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Accedere a View dentro ad un ListItem non visualizzato?
« Risposta #1 il: 14 Agosto 2012, 12:11:25 CEST »
+1
Il problema è che le view degli item non visibili... non esistono proprio!
ListView è costruito per ottimizzare l'uso della memoria, man mano che si scorre la lista, vengono create (o meglio riciclate) le view necessarie.

Per cui basta che nascondi le ImageView solo degli item visibili (getChildCount () ti dice quanti ne sono, tieni presente che getChildAt(i) ti riporta l'item alla posizione visibile i, non quello rispetto la posizione dei tuoi dati, sono due posizioni diverse)

e poi quando crei i nuovi elementi (nella getView) ti ricordi che la ImageView non va mostrata
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:Accedere a View dentro ad un ListItem non visualizzato?
« Risposta #2 il: 05 Settembre 2012, 09:26:03 CEST »
0
Per cui basta che nascondi le ImageView solo degli item visibili (getChildCount () ti dice quanti ne sono, tieni presente che getChildAt(i) ti riporta l'item alla posizione visibile i, non quello rispetto la posizione dei tuoi dati, sono due posizioni diverse)

Grazie!
Capisco, però avrei necessità di nascondere le ImageView anche degli item non visibili. Esiste un modo per estrarre gli item senza usare getChildAt(i), cioè senza il vincolo che siano visibili?
Grazie ancora!  :-)

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Accedere a View dentro ad un ListItem non visualizzato?
« Risposta #3 il: 05 Settembre 2012, 21:33:47 CEST »
0
Capisco, però avrei necessità di nascondere le ImageView anche degli item non visibili. Esiste un modo per estrarre gli item senza usare getChildAt(i), cioè senza il vincolo che siano visibili?
Gli item non puoi "estrarli" in quanto non esistono proprio! La ListView ottimizza la memoria creando gli item solo man mano che servono e quelli non più visibili li "butta" (o, meglio, li ricicla se tu usi correttamente le sue funzioni).

Puoi nascondere le ImageView necessarie, nella funzione di getView(),
man mano che il sistema ti chiede di dargli la view di nuovi item,
tu controlli se le ImageView devono essere visibili o meno

Se per esempio l'item 2 non è visibile, allora ti devi memorizzare tu da qualche parte il suo status "ImageView non visibili" e quando la getView ti chiede di dargli l'item 2, tu nella view che crei, nascondi le ImageView
 :-)
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:Accedere a View dentro ad un ListItem non visualizzato?
« Risposta #4 il: 12 Settembre 2012, 18:02:55 CEST »
0
Ho risolto:
- lasciando solamente p.setbNelCarrello(false);
- togliendo le 3 righe sotto;
- aggiungendo notifyDataSetChanged() dopo le operazioni di reset delle ImageView.  :-P
Grazie per l'aiuto!

Gli item non puoi "estrarli" in quanto non esistono proprio! La ListView ottimizza la memoria creando gli item solo man mano che servono e quelli non più visibili li "butta" (o, meglio, li ricicla se tu usi correttamente le sue funzioni).

Puoi nascondere le ImageView necessarie, nella funzione di getView(),
man mano che il sistema ti chiede di dargli la view di nuovi item,
tu controlli se le ImageView devono essere visibili o meno

Se per esempio l'item 2 non è visibile, allora ti devi memorizzare tu da qualche parte il suo status "ImageView non visibili" e quando la getView ti chiede di dargli l'item 2, tu nella view che crei, nascondi le ImageView
 :-)

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.