Autore Topic: Problema con ListView a scelta multipla  (Letto 1327 volte)

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Problema con ListView a scelta multipla
« il: 30 Agosto 2011, 13:27:22 CEST »
0
Salve a tutti, ho un problema che non riesco a spiegarmi con una ListView.
Ho creato questo elenco a scelta multipla e ho necessità di sapere alla pressione di un Button quali sono gli elementi selezionati dal menu a scelta multipla:

Codice (Java): [Seleziona]
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_multiple_choice, items);
final ListView lista = (ListView) findViewById(R.id.ListViewCategory);
lista.setAdapter(adapter2);
lista.setChoiceMode(2);

final Button buttonCerca = (Button) findViewById(R.id.cerca);
        buttonCerca.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {

                ArrayList <String >categorieScelte = new ArrayList<String>();
                SparseBooleanArray itemsScelti = lista.getCheckedItemPositions();
                Log.d(TAG, "prova: "+itemsScelti.valueAt(0));
                Log.d(TAG, "prova: "+itemsScelti.valueAt(1));
                Log.d(TAG, "prova: "+itemsScelti.valueAt(2));
                Log.d(TAG, "prova: "+itemsScelti.valueAt(3));
                Log.d(TAG, "prova: "+itemsScelti.valueAt(4));
                for(int i=0; i<items.length;i++) {
                   if (itemsScelti.valueAt(i)) {
                           categorieScelte.add((String) lista.getAdapter().getItem(i));
                   }
                }
                } catch (Exception e) {
                        Log.d(TAG, "errore: "+e);
                }
                startActivity(intentCerca);
            }
        });

Con l'array di riferimento items così definito:

Codice (Java): [Seleziona]
static final String[] items = new String[] { "...." };
Il problema è che tramite una serie di Log mi sono reso conto che la selezione dal menu a scelta multipla non viene individuata bene, nel senso che il "getCheckedItemPositions()" individua le selezioni "arbitrariamente" e senza che ci sia reale corrispondenza con le spunte eseguite nella lista.
Insomma, per fare un esempio, su tre selezioni ne azzecca una corretta e due sbagliate (o anche tutte sbagliate).

Come è possibile? Come posso risolvere?

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Problema con ListView a scelta multipla
« Risposta #1 il: 30 Agosto 2011, 16:19:03 CEST »
0
Ho risolto facendo il controllo così:

Codice (Java): [Seleziona]
if (lista.isItemChecked(i)) {
direttamente sulla listView e non più usando lo SparseBooleanArray

Offline AriTiAdoro

  • Utente junior
  • **
  • Post: 98
  • Da soli non si va da nessuna parte!!
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con ListView a scelta multipla
« Risposta #2 il: 01 Settembre 2011, 10:11:50 CEST »
0
Ciao io ho il tuo stesso problema e finalmente ho trovato qualcuno che ce l ha come me! io al click del pulsante devo cancellare gli elementi selezionati. Sembra una cavolata ma sto impazzendo non riescooo!! Puoi postarmi il tuo codice?!?
Te ne sarei infinitamente grato!!
Simo :)

Offline liuk78

  • Utente junior
  • **
  • Post: 73
  • Respect: +5
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con ListView a scelta multipla
« Risposta #3 il: 01 Settembre 2011, 10:44:26 CEST »
0
Se non ho capito male il codice e la soluzione li ha gia postati e dovrebbe essere cosi

Codice (Java): [Seleziona]
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_multiple_choice, items);
final ListView lista = (ListView) findViewById(R.id.ListViewCategory);
lista.setAdapter(adapter2);
lista.setChoiceMode(2);

final Button buttonCerca = (Button) findViewById(R.id.cerca);
        buttonCerca.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {

                ArrayList <String >categorieScelte = new ArrayList<String>();
                for(int i=0; i<items.length;i++) {
                   if (lista.isItemChecked(i)) {
                           categorieScelte.add((String) lista.getAdapter().getItem(i));
                   }
                }
                } catch (Exception e) {
                        Log.d(TAG, "errore: "+e);
                }
                startActivity(intentCerca);
            }
        });

Offline AriTiAdoro

  • Utente junior
  • **
  • Post: 98
  • Da soli non si va da nessuna parte!!
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con ListView a scelta multipla
« Risposta #4 il: 01 Settembre 2011, 11:32:49 CEST »
0
Io devo cancellare gli elementi selezionati e ho fatto cosi:


Codice (Java): [Seleziona]
eliminaSelezionati.setOnClickListener(new View.OnClickListener(){
        public void onClick(View view){
               
               
                 int i;
                 
                  for( i=0; i<elencoNomi.size();i++) {
                         if (listview.isItemChecked(i)) {
                                 Log.i("Cancello",":" + elencoNomi.get(i)); //elencoNomi è l'arrayList con dentro dei nomi
                                 adapter.remove(elencoNomi.get(i));
                                 
                               
                         }
                        adapter.notifyDataSetChanged();
                         
                  }



Ma me ne cancella uno giusto e gli altri sbagliati;non risco a risolvere il problema
Simo :)

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:Problema con ListView a scelta multipla
« Risposta #5 il: 01 Settembre 2011, 11:39:21 CEST »
0
il codice che ho usato è come quello di liuk, sono anche io alle prime armi con lo sviluppo su Android, ma l'unica differenza che noto con il tuo codice Arit è che tu non usi un Adapter.
Forse è quello il problema, prova ad usarlo e aspetto qualcuno degli esperti per altri suggerimenti  :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema con ListView a scelta multipla
« Risposta #6 il: 01 Settembre 2011, 12:34:25 CEST »
0
Ma me ne cancella uno giusto e gli altri sbagliati;non risco a risolvere il problema

Devi creare un'altra lista con i soli elementi non selezionati e a quel punto la assegni all'adapter.
Se tu vai a cancellare gli elementi dall'adapter lui ovviamente perde la traccia di quali sono selezionati o meno.
« Ultima modifica: 01 Settembre 2011, 12:37:11 CEST da Ricky` »

Offline AriTiAdoro

  • Utente junior
  • **
  • Post: 98
  • Da soli non si va da nessuna parte!!
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con ListView a scelta multipla
« Risposta #7 il: 01 Settembre 2011, 13:41:29 CEST »
0
funziona! grazie...
Però c'e una pecca che dovrei risolvere..ovvero se l'utente seleziona 5 utenti e preme il pulsante questi vengono cacellati;e fin qui tutto bene.
Però se l'utente poi si ricorda di dover cancellare anche per esempio altri 2 utenti,si ripete la procedura e gli utenti non selezionati vengono ancora copati nella lista UtentiNonSelezionati,e qui c'e l'errore.
Teoricamente si dovrebbe creare una nuova lista ogni volta che si clicca sul pulsante....
Simo :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema con ListView a scelta multipla
« Risposta #8 il: 01 Settembre 2011, 13:49:17 CEST »
0
funziona! grazie...
Però c'e una pecca che dovrei risolvere..ovvero se l'utente seleziona 5 utenti e preme il pulsante questi vengono cacellati;e fin qui tutto bene.
Però se l'utente poi si ricorda di dover cancellare anche per esempio altri 2 utenti,si ripete la procedura e gli utenti non selezionati vengono ancora copati nella lista UtentiNonSelezionati,e qui c'e l'errore.
Teoricamente si dovrebbe creare una nuova lista ogni volta che si clicca sul pulsante....

Beh per fare questo devi scrivere tu correttamente l'algoritmo, la logica mi sembra che ce l'hai chiara.