Autore Topic: Come si recerca all'interna di una listview?  (Letto 980 volte)

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Come si recerca all'interna di una listview?
« il: 03 Dicembre 2011, 09:13:25 CET »
0
Ciao sto provando a mettere un ricerca sulla lista, ho fatto così, ma non funziona, mi scompaiono tutti gli elementi della lista:
Codice (Java): [Seleziona]
listaAdapter.getFilter().filter(stringa);
io ho capito che con il filter, filtrava da solo in base alla string a passata, invece, la lista si svuota  :-(


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come si recerca all'interna di una listview?
« Risposta #1 il: 03 Dicembre 2011, 11:18:52 CET »
0
Ciao sto provando a mettere un ricerca sulla lista, ho fatto così, ma non funziona, mi scompaiono tutti gli elementi della lista:
Codice (Java): [Seleziona]
listaAdapter.getFilter().filter(stringa);
io ho capito che con il filter, filtrava da solo in base alla string a passata, invece, la lista si svuota  :-(



Dovresti darci qualche info sull'adapter che usi.

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #2 il: 03 Dicembre 2011, 11:40:03 CET »
0
Si giusto, hai ragione.. Mi sono dimenticato..

Comunque è un  ArrayAdapter, quindi dovrebbe  funzionare il filter..
L'intestazione della classe è questa:
Codice (Java): [Seleziona]
public class InterventoAdapter extends ArrayAdapter<Intervento>

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come si recerca all'interna di una listview?
« Risposta #3 il: 03 Dicembre 2011, 12:18:28 CET »
+1
Si giusto, hai ragione.. Mi sono dimenticato..

Comunque è un  ArrayAdapter, quindi dovrebbe  funzionare il filter..
L'intestazione della classe è questa:
Codice (Java): [Seleziona]
public class InterventoAdapter extends ArrayAdapter<Intervento>

Funzionerebbe se il tuo adapter fosse un ArrayAdapter<String> ma nel tuo caso devi crearti un filtro personalizzato.

Trovi qui un esempio:

android - How to write a  custom filter for ListView with ArrayAdapter - Stack Overflow



Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #4 il: 03 Dicembre 2011, 15:51:53 CET »
0
Ci provo , e faccio sapere.. grazie mille per ora

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #5 il: 09 Dicembre 2011, 12:33:04 CET »
0
allora, ho provato, ma non capisco perchè quando carico l'activity con llistview non ho nessun elemento all'interno,

Codice (Java): [Seleziona]
    private class InterventoAdapterFilter extends Filter {
        protected FilterResults performFiltering(CharSequence stringaFiltro) {
 
            // Initiate our results object
            FilterResults results = new FilterResults();

                if(stringaFiltro.length() == 0){
                        results.values = interventi;
                results.count = interventi.size();
                }else{

            // No prefix is sent to filter by so we're going to send back the original array
          /*  if (prefix == null || prefix.length() == 0) {
                synchronized (mLock) {
                    results.values = originalItems;
                    results.count = originalItems.size();
                }
            } else {*/

                synchronized(mLock) {
                        // Compare lower case strings
                    //String prefixString = prefix.toString().toLowerCase();
                    final ArrayList<Intervento> filteredItems = new ArrayList<Intervento>();
                    // Local to here so we're not changing actual array
                    final ArrayList<Intervento> localItems = new ArrayList<Intervento>();
                    localItems.addAll(interventi);
                    final int count = localItems.size();

                    for (int i = 0; i < count; i++) {
                        final Intervento item = localItems.get(i);
                        final String itemVia = item.getVia().toString();
                        final String itemManutenre = item.getManutentore().toString();
                        final String itemPaese = item.getPaese().toString();

                        // First match against the whole, non-splitted value
                        if (itemVia.contentEquals(stringaFiltro) || itemManutenre.contentEquals(stringaFiltro) || itemPaese.contentEquals(stringaFiltro)) {
                            filteredItems.add(item);
                        }
                    }
                    // Set and return
                    results.values = filteredItems;
                    results.count = filteredItems.size();
                }//end synchronized
                }
                                return results;
            }

        @Override
        protected void publishResults(CharSequence prefix, FilterResults results) {
            //noinspection unchecked
            synchronized(mLock) {
                final ArrayList<Intervento> localItems = (ArrayList<Intervento>) results.values;
                notifyDataSetChanged();
                clear();
                //Add the items back in
                for (Iterator iterator = localItems.iterator(); iterator
                        .hasNext();) {
                        Intervento i = (Intervento) iterator.next();
                    add(i);
                }
            }//end synchronized
        }
    }

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #6 il: 17 Dicembre 2011, 14:46:48 CET »
0
ora sono riuscito a filtare la lista, ho cambiato con un cursor adapter e basta fare getfilter.filter(stringa) e funziona.

ora il problema è che non riesco più ad eliminare il filtro.. Come posso fare?

La stringa per il filtro la prendo da un spinner, e qunado selezione la riga vuota, che contiene "", vorrei eliminare il filtro, ma non c'è nessun metodo per farlo..  :-(

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #7 il: 20 Dicembre 2011, 12:44:45 CET »
0
nessuno sa come resettare il filtro preso come
Codice (Java): [Seleziona]
listview.getFilter().filter(stringa);

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Come si recerca all'interna di una listview?
« Risposta #8 il: 20 Dicembre 2011, 12:48:59 CET »
0
Non so come è fatto il tuo codice, ma io farei rigenerare la ListView senza invocare il filtro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come si recerca all'interna di una listview?
« Risposta #9 il: 20 Dicembre 2011, 13:16:39 CET »
0
Codice (Java): [Seleziona]
listview.getFilter().filter(null);

Ovviamente devi implementare tu stesso che quando viene passato null rimetti tutti gli elementi.

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #10 il: 20 Dicembre 2011, 13:17:23 CET »
0
cioè? Dovrei fare l'override del metodo filter?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come si recerca all'interna di una listview?
« Risposta #11 il: 20 Dicembre 2011, 13:20:49 CET »
0
nel codice che hai postato sopra hai commentato il codice che dovrebbe servirti:


Codice (Java): [Seleziona]
          /*  if (prefix == null || prefix.length() == 0) {
                synchronized (mLock) {
                    results.values = originalItems;
                    results.count = originalItems.size();
                }
            } else {*/

ovviamente invece che prefix la tua stringa è stringaFiltro

Offline Teo

  • Utente junior
  • **
  • Post: 98
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid E / Xoom2
  • Sistema operativo:
    Mac OS X 10.8
Re:Come si recerca all'interna di una listview?
« Risposta #12 il: 20 Dicembre 2011, 18:02:04 CET »
0
Finalmente sono riuscito a far filtrare la lista  :D :D :D :D :D :D :D :D
Grazie a tutti!!

Però ho un'altro quesito, come faccio se voglio farla filtrare su 3 campi diversi contemporaneamente???