Autore Topic: Cambio colore background della view in una ListView multichoice  (Letto 314 volte)

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Cambio colore background della view in una ListView multichoice
« il: 14 Agosto 2015, 09:32:44 CEST »
0
Ciao ragazzi, sto impazzendo da giorni per cambiare il background della view dell'item checked di una ListView.
In linea di massima ci sono riuscito ma il problema è che viene cambiato a più item e poi scorrendo in alto e in basso la listview i background iniziano a passare da un item all'altro quindi senza mantenere la selezione originaria.

In pratica al longclick dell'item parte una actionmode e io inizio a selezionare gli oggetti per cancellarli tutti insieme, la logica funziona e gli oggetti selezionati vengono cancellati correttamente il problema è che io voglio evidenziare quelli che ho selezionato, vi scrivo il codice che ho usato, mi spieghereste dove sbaglio o cosa altro devo fare per far si che cliccando un solo item se ne evidenzi uno solo e scorrendo la listview quelli evidenziati rimangano in memoria?

Codice (Java): [Seleziona]
@Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                if (checked) {
                    listView.getChildAt(position - listView.getFirstVisiblePosition()).setBackgroundColor(Color.parseColor("#C2C2C2"));
                } else {
                    listView.getChildAt(position - listView.getFirstVisiblePosition()).setBackgroundColor(Color.TRANSPARENT);
                }

                mode.setTitle(listView.getCheckedItemCount() + "");
            }

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cambio colore background della view in una ListView multichoice
« Risposta #1 il: 14 Agosto 2015, 10:30:24 CEST »
0
Il tuo approccio non funziona perché intervieni sulla view che contiene l'elemento del ListView, ma questa vista viene riciclata per elementi differenti. Il principio è più o meno questo: quando scorri verso l'alto l'elemento che va a finire fuori pagina viene passato alla getView (parametro convertView) e riciclato per generare l'elemento che sta per comparire in basso. E' un meccanismo usato per risparmiare risorse.

In linea di massima quando si interviene su una proprietà degli elementi contenuti nel listview (come in questo caso la selezione on/off) è necessario informare l'adapter, altrimenti si sta sicuramente sbagliando qualcosa.

Io ti consiglio di aggiungere un arraylist di interi all'adapter ed aggiungere o togliere l'ID (o il position) degli elementi selezionati a quel campo.

Poi nella getView dell'adapter verifichi se l'ID (o la position) è nell'arraylist: se c'è cambi il colore di sfondo, altrimenti lo reimposti al valore di default.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Cambio colore background della view in una ListView multichoice
« Risposta #2 il: 14 Agosto 2015, 10:33:53 CEST »
+1
Si grazie, il concetto lo sapevo immaginavo fosse quello, ma pensavo ci fosse un modo di default per risolvere infatti l'ho trovato e mi è stato sufficiente includere nel layout di ogni row questo:

android:background="?android:attr/activatedBackgroundIndicator"