Autore Topic: Posizione elemento listview prima del filter  (Letto 1231 volte)

Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Posizione elemento listview prima del filter
« il: 16 Maggio 2011, 21:26:30 CEST »
0
Salve a tutti, ed innanzitutto complimenti per questo bellissimo ed utilissimo portale, sto leggendo tantissime guide e sono veramente utilissime!
Scrivo in quanto ho un problema con un'applicazione che sto scrivendo. L'app ha un'interfaccia divisa in fragment e, in quello di sinistra, è presente una listview con un elenco di record frutto di una query. Questi record vengono popolati da un arrayAdapter che ha un'associazione nome -> id in maniera tale che, al click su un elemento, io riesca a prendermi l'id del record in base alla posizione (che sarà la stessa nell'arrayAdapter) e quindi visualizzare i dettagli relativi.
Il problema però compare quando la lista viene filtrata da una editview di ricerca posta in alto. Infatti la posizione che viene restituita è quella della lista filtrata e, di conseguenza, la posizione nell'array adapter non è quella giusta. Sapete per caso come posso fare per risalire alla posizione corretta?
Grazie mille a tutti :)

Ps : ho anche un altro piccolissimo problema, non se devo aprire un topic a parte.. praticamente in alto c'è anche un tabhost a 4 tab ed ogni volta che clicco su un tab mi compare la tastiera a video (viene messo il focus sull'edittext di ricerca), come posso fare per evitare che ciò avvenga? Ho implementato il codice di scomparsa nel tabChangedListener ma l'effetto della tastiera che prima entra e poi esce è inguardabile..

Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Re:Posizione elemento listview prima del filter
« Risposta #1 il: 18 Maggio 2011, 15:02:38 CEST »
0
Nessuno mi sa aiutare?
Ho letto che implementando il metodo getIdemId() si dovrebbe riuscire a prendere l'id della riga della listview nativo, ma non riesco a farlo funzionare..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Posizione elemento listview prima del filter
« Risposta #2 il: 18 Maggio 2011, 15:10:21 CEST »
0
L'id dovrebbe essere una proprietà dell'oggetto che metti nell'ArrayList, in questo modo diventa facile ottenerlo anche se manipoli il contenuto dell'adapter.
« Ultima modifica: 18 Maggio 2011, 15:15:14 CEST da Ricky` »

Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Re:Posizione elemento listview prima del filter
« Risposta #3 il: 19 Maggio 2011, 09:08:25 CEST »
0
Ciao Ricky, grazie per la risposta.
Il punto è che l'id che mi viene restituito è uguale alla posizione. Quindi in seguito ad un filter anch'esso è errato. Ho provato a fare anche un getidemid(position) ma nulla, l'indice è sempre lo stesso :(
Ma è mai possibile questa cosa?  ???

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:Posizione elemento listview prima del filter
« Risposta #4 il: 19 Maggio 2011, 09:20:49 CEST »
+1
Il punto è che l'id che mi viene restituito è uguale alla posizione. Quindi in seguito ad un filter anch'esso è errato. Ho provato a fare anche un getidemid(position) ma nulla, l'indice è sempre lo stesso :(
Ma è mai possibile questa cosa?  ???

No, non mi sembra possibile. Io ho sempre saputo quello che ha già detto Ricky, cioè che l'ID che ottieni è quello dell'ArrayList collegato all'adapter.

Ho fatto anche io recentemente una listview con una sessantina di item nell'ArrayList, appartenenti a 3 categorie diverse. Posso disattivare individualmente gli item di una categoria. Quando agisco in tal modo, modifico l'ArrayList collegato all'adapter quindi notifico il cambio dei dati all'adapter stesso con NotifyDatasetChange() e tutto funziona bene.

Faccio una domanda: ma il filter a che livello agisce?
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:Posizione elemento listview prima del filter
« Risposta #5 il: 19 Maggio 2011, 09:32:35 CEST »
0
Giusto per essere chiari, la mia idea è:

Aggiungi un attributo id nella tua classe:

Codice (Java): [Seleziona]
class Item{

        private id;
       
        public getId(){
                return id;     
        }      
       
}

poi nell'adapter fai nel seguente modo:

Codice (Java): [Seleziona]
class MyAdapter extends ArrayAdapter<Item>{

       //Dichiarazione di getView ed eventuali altri metodi
       
        @Override
        public int getItemId(int position){
                return getItem(position).getId();      
        }
       
}


PS: il codice l'ho scritto a memoria, magari c'è da aggiustarlo




Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Re:Posizione elemento listview prima del filter
« Risposta #6 il: 19 Maggio 2011, 18:11:27 CEST »
0
Ciao.
Per popolare la listview ho una variabile di tipo ArrayAdapter di stringhe, le quali stringhe vengono prese da una query sql e faccio un un diretto setListAdapater(myAdapter).
Ho poi una edittext per le ricerche che ha un TextWatcher associato, nel cui textwatcher ho questo :

Codice (Java): [Seleziona]
   // Search Method
        TextWatcher filterTextWatcher = new TextWatcher() {

            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                myAdapter.getFilter().filter(s);
                myAdapter.notifyDataSetChanged();
            }

        };
       

Ho anche l'implementazione del metodo  "public int getItemId(int position)"  all'interno della mia classe che estende ListFragment, il quale però mi ritorna come id sempre la posizione corrente della lista filtrata. Ma questo itemId lo devo associare "a mano" tipo con qualche metodo di set nella creazione della listview?

:(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Posizione elemento listview prima del filter
« Risposta #7 il: 19 Maggio 2011, 18:26:21 CEST »
+1
Ma per qualche motivo non hai usato un SimpleCursorAdapter passandogli direttamente il cursore? Ti darebbe direttamente l'id dell'elemento all'interno del database.

Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Re:Posizione elemento listview prima del filter
« Risposta #8 il: 20 Maggio 2011, 10:50:47 CEST »
0
Ciao Ricky, ho provato ad usare nuovamente il simpleCursorAdapter ed in effetti ora l'id che mi restituisce il metodo onListItemClick è l'id del record selezionato, almeno nella lista non filtrata.
Il problema ora è che la lista non viene più filtrata come già sapevo in quanto, con il SimpleCursorAdapter, c'è bisogno di rifare la query ogni volta che viene scritto un carattere nella EditText di ricerca, giusto? E' una cosa questa che vorrei evitare, l'applicazione nasce per gestire un'infinità di dati, non vorrei sovraccaricare troppo con questo metodo.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Posizione elemento listview prima del filter
« Risposta #9 il: 20 Maggio 2011, 11:42:01 CEST »
+1
Beh tutto dipende da quanti dati devi maneggiare. Se l'ordine è quello delle centinaia di elementi o di migliaia non mi preoccuperei troppo, la ricerca nel db non dovrebbe avere problemi.

Premesso che effettivamente se la tua query va a fare un LIKE non puoi contare sull'indicizzazione della colonna, se ti implementi un CursorAdapter puoi avere delle buone performance eseguendo la query in un background thread (vedi metodo runQueryOnBackgroundThread).

Detto questo devi comunque considerare che caricare tutti i dati un un arraylist è un operazione di per se onerosa e lo è anche quella di filtraggio perchè sostanzialmente quello che viene fatto è ciclare l'arraylist e verificare se per ogni elemento c'è un match con il pattern che ha inserito l'utente.
Se comunque vuoi utilizzare la strada dell'arraylist ti conviene creare una piccola classe che ti permetta di salvare sia la stringa sia il suo id (vedi il mio esempio precedente).

Offline nameless

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Iconia
  • Sistema operativo:
    Windows 7
Re:Posizione elemento listview prima del filter
« Risposta #10 il: 20 Maggio 2011, 12:54:46 CEST »
0
Ho intrapreso la strada del simpleCursorAdapter e delle query per filtraggio, usando anche un carattere jolly per effettuare o no la ricerca instring e devo dire che le performance sono buone, testerò poi anche con centinaia di migliaia di dati ma devo dire che per ora sono soddisfatto! Inoltre questo mi ha anche risolto un piccolo problema : così è molto più semplice gestire le custom rows della listview con più elementi sulla singola riga.

Grazie mille Ricky e grazie agli altri utente che hanno risposto, il problema è risolto ed ho imparato altre cose! ;)

Ps : per la questione della tastiera che appare al cambio di tab ne sapete niente?