Autore Topic: [Android] Cancellare item da ListView multiple Choice  (Letto 2702 volte)

Offline RIACK

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
[Android] Cancellare item da ListView multiple Choice
« il: 21 Marzo 2013, 00:40:39 CET »
0
Devo semplicemente cancellare tutte le righe "checkate" di una ListView multi choise, ma proprio non ce la faccio... vi riporto il codice completo (la parte cruciale e che non va, è la funzione elimina() )


Codice: [Seleziona]

public class MainActivity extends Activity {

        ListView lista;
        ArrayList<String> al = new ArrayList<String>();
        ArrayAdapter<String> adapter;
   
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,        al);
                lista = (ListView) findViewById(R.id.lista);
                lista.setAdapter(adapter);
               
                Button add_name = (Button) findViewById(R.id.add_name);
                add_name.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                                Intent i = new Intent(MainActivity.this, Activity2.class);
                                startActivityForResult(i, 1);
                        }
            });
               
                Button delete = (Button) findViewById(R.id.delete);
                delete.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                                elimina();
                        }
            });
        }
       
        public void onActivityResult (int requestCode, int resultCode, Intent i) {
                String pkg = getPackageName();
                String nome = i.getStringExtra(pkg+"nome");
        al.add(nome);
        adapter.notifyDataSetChanged();
        lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        }
       
        private void elimina() {
        SparseBooleanArray checked = lista.getCheckedItemPositions();
        for (int i = 0; i < lista.getCount(); i++) {
            if (checked.get(i)) {
                al.remove(i);
            }
        }
        adapter.notifyDataSetChanged();
        lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        }
}


Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #1 il: 21 Marzo 2013, 10:21:02 CET »
0
dovresti postare il logcat..

penso che cmq il problema sia che quando fai al.remove(i); la posizione degli elementi cambia.
Metti che hai una lista così ("1","2","3","4","5","6")
se devi rimuovere 2 4 e 6, le position(indici dell'array) checkate saranno 1,3 e 5
se rimuovi 1 avrai ("1","3","4","5","6") OK
se rimuovi 3 avrai ("1","3","4","6") non dà errore ma ha rimosso la position sbagliata
se rimuovi 5 avrai OutOfBoundException perchè a sto punto non esiste più un elemento in posizione 5.

se fai qualche prova vedrai che cancella esattamente solo il primo elemento che è checkato.
si potrebbe risolvere con un contatore di quanti elementi hai già cancellato in quel ciclo,e sottrarre quel valore ogni volta alla position che hai nello sparsearray.

un'altra cosa, lista.getCheckedItemPositions(); torna una "mappa" <int,boolean>,al posto di ciclare su tutta la lista e vedere testare se ogni elemento è checkato,puoi usare direttamente lo sparsearray,ad esempio(inserisco anche un contatore)
Codice (Java): [Seleziona]
SparseBooleanArray checked = lista.getCheckedItemPositions();
        int count = 0;
        SparseBooleanArray checked = lista.getCheckedItemPositions();
        for (int i=0;i<checked.size();i++) {
                int position = checked.keyAt(i);
                position= position-count;
           // qui fai il remove
           //adapter.remove(adapter.getItem(position-count));
           count++;
        }

spero di essermi spiegatoXD

edit:un'altra cosa,le posizioni checkate non si resettano dopo il remove,quindi vedrai checkati gli item che ora sono nella position di quelli che avevi checkato prima,prova a chiamare lista.clearChoices() per resettarli
« Ultima modifica: 21 Marzo 2013, 10:33:33 CET da lorux »

Offline RIACK

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #2 il: 21 Marzo 2013, 11:45:01 CET »
0
dovresti postare il logcat..

penso che cmq il problema sia che quando fai al.remove(i); la posizione degli elementi cambia.
Metti che hai una lista così ("1","2","3","4","5","6")
se devi rimuovere 2 4 e 6, le position(indici dell'array) checkate saranno 1,3 e 5

....

edit:un'altra cosa,le posizioni checkate non si resettano dopo il remove,quindi vedrai checkati gli item che ora sono nella position di quelli che avevi checkato prima,prova a chiamare lista.clearChoices() per resettarli

Innanzitutto grazie per la risposta...
Ecco la soluzione al mio problema (suggerita da te).
Funziona alla grande! GRAZIE!

Codice: [Seleziona]
        SparseBooleanArray checked = lista.getCheckedItemPositions();
        int position;
        for (int i = 0; i < checked.size(); i++) {
                position = checked.keyAt(i);
            adapter.remove(adapter.getItem(position - i));
        }
        adapter.notifyDataSetChanged();
        lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lista.clearChoices();
« Ultima modifica: 21 Marzo 2013, 12:10:50 CET da RIACK »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #3 il: 21 Marzo 2013, 12:08:58 CET »
0
Innanzitutto grazie per la risposta...
CUT

allora,il tuo checked è una mappa<position,valore> fatta così(se hai checkato 5 elementi in position 2,3,6,7,8)
[2,true]
[3,true]
[6,true]
[7,true]
[8,true]

se cicli sulla size(),"i" sarà progressivamente 0,1,2,3,4.
quindi non puoi usare i per fare il remove,devi prendere la position da quella mappa,guarda nell'esempio che ti ho scritto prima,lì faccio
Codice (Java): [Seleziona]
int position = checked.keyAt(i);
che per i = 0 mi ritorna il 2,per i=1 mi ritorna 3 e così via.
poi visto che rimuovi degli elementi,sistemo il valore della position con
Codice (Java): [Seleziona]
position= position-count;
capito ora?:P

Offline RIACK

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #4 il: 21 Marzo 2013, 12:11:49 CET »
0
allora,il tuo checked è una mappa<position,valore> fatta così(se hai checkato 5 elementi in position 2,3,6,7,8)
[2,true]
[3,true]
[6,true]
[7,true]
[8,true]

se cicli sulla size(),"i" sarà progressivamente 0,1,2,3,4.
quindi non puoi usare i per fare il remove,devi prendere la position da quella mappa,guarda nell'esempio che ti ho scritto prima,lì faccio
Codice (Java): [Seleziona]
int position = checked.keyAt(i);
che per i = 0 mi ritorna il 2,per i=1 mi ritorna 3 e così via.
poi visto che rimuovi degli elementi,sistemo il valore della position con
Codice (Java): [Seleziona]
position= position-count;
capito ora?:P

ho modifica il post di sopra... GRAZIE MILLE!!!

P.S. guardando nel metodo che inserisce i valori nella lista (primo post), se volessi anche salvarli in un file e poi eliminarli dal file con il metodo elimina (oltre che dalla lista), ci "metto poco"?
« Ultima modifica: 21 Marzo 2013, 12:13:22 CET da RIACK »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #5 il: 21 Marzo 2013, 12:50:07 CET »
0
beh non tanto,forse converrebbe sovrascrivere ogni volta il contenuto del file piuttosto che leggerlo e parsarlo e controllare le linee..
invece se te li salvassi su db sarebbe molto + comodo

Offline RIACK

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #6 il: 21 Marzo 2013, 13:45:17 CET »
0
beh non tanto,forse converrebbe sovrascrivere ogni volta il contenuto del file piuttosto che leggerlo e parsarlo e controllare le linee..
invece se te li salvassi su db sarebbe molto + comodo

è che sto imparando adesso a programmare per android e devo farlo come esercizio... ancora non ho idea di come si fa ci guardo... speravo fossero 3 o 4 righe che magari poteva scrivermi qualcuno :D

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #7 il: 21 Marzo 2013, 13:53:38 CET »
0

Offline xixietto

Re:[Android] Cancellare item da ListView multiple Choice
« Risposta #8 il: 10 Marzo 2015, 15:51:46 CET »
0
sono piu o meno nello stesso problema.. ma non uso le mappe... come risolvo?