Autore Topic: [Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView  (Letto 2163 volte)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Livello di difficoltà: facile
Target SDK: 7
Min SDK: 5
Link al file compresso del progetto eclipse: file in allegato

Ecco qui un semplice tutorial che vi mostra come ottenere l'id dell'elemento selezionato di un'autocompleteTextView, anche in caso di filtro applicato (in pratica si ottiene l'id EFFETTIVO dell'array). In aggiunta, vi mostro quello che io chiamerei DropDownMenu, una cosa assente in android che a me piace molto, assomiglia ad uno spinner ma è un dropdown menu!

Di seguito la semplice interfaccia all'apertura dell'activity:


Al click sulla barra, si ottiene la lista di elementi:


Al click dell'elemento ecco cosa si ottiene:


Tutto questo utilizzando la procedura particolare che ri-ottiene l'id orginale. Se non si utilizzasse tale metodo, si otterrebbe l'id dell'elemento nella lista dei filtrati, che è sbagliato, nell'esempio filtriamo su Vettel, essendocene uno otteniamo id = 0, ma il pilota 0 è Alonso!


La procedura è molto semplice, per dettagli maggiori scaricatevi i sorgenti completi in allegato...
manteniamo all'interno dell'activity l'array di nomi (che può anche provenire da un database) e un valore intero, che rappresenta l'id reale dell'elemento cliccato, inizializzato a -1
Codice (Java): [Seleziona]
protected int actualRealId = -1;
private String[] piloti = { "Alonso Fernando", "Webber Mark", "Vettel Sebastian", "Hamilton Lewis" };

Dopo aver inizializzato il contentView dell'app, creiamo l'autocomplete TextView; Assegniamo ad ogni item uno specifico layout, dopodiche settiamo a null l'input type, in modo da evitare di avere la softkeyboad che si autoavvia, cosi da far sembrare proprio un dropdown menu!
Quindi assegniamo un listener (onClick+onFocus) alla textView:
Codice (Java): [Seleziona]
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.autocompleteitem, piloti);
                AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit);
                textView.setAdapter(adapter);
                textView.setInputType(InputType.TYPE_NULL);
                ACTWListener actvListener = new ACTWListener(textView);
                textView.setOnClickListener(actvListener);
                textView.setOnFocusChangeListener(actvListener);

Aggiungiamo un onItemClickListener sulla textView:
Codice (Java): [Seleziona]
textView.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                int selectedId = (int) id;
                                String selectedText = piloti[selectedId];
                                //Setto il testo (sotto) a quello ottenuto usando direttamente i valori
                                selectedIdTv.setText(""+selectedId);
                                selectedNameTv.setText(selectedText);
                                //Setto il testo (sopra) a quello ottenuto usando il parent.getItem e la ricerca manuale dell'id
                                String selectedRealText = (String) parent.getItemAtPosition(position);
                                int selectedrealId = getTableId(selectedRealText);
                                arrayNameTv.setText(selectedRealText);
                                arrayIdTv.setText(""+selectedrealId);
                        }
                });

E qui di seguito il codice per ottenere l'id, una semplice ricerca iterativa sull'array:
Codice (Java): [Seleziona]
        private int getTableId(String name) {
                for (int i = 0; i < piloti.length; i++) {
                        if (piloti[i].equalsIgnoreCase(name))
                                return i;
                }
                return 0;
        }

Questo l'xml dell'autocompleteitem:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1" style="?android:attr/spinnerDropDownItemStyle"
        android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"
        android:ellipsize="marquee" />

Molto semplice e basilare...
Ed ora il codice del listener, che altro non fa che gestire gli eventi sulla textView,per far comparire e scomparire il dropdown menu al click!
Codice (Java): [Seleziona]
private boolean showing = false;

        AutoCompleteTextView view;

        public ACTWListener(AutoCompleteTextView v) {
                view = v;
        }

        @Override
        public void onClick(View v) {
                if (showing)
                        view.dismissDropDown();
                else
                        view.showDropDown();
                showing = !showing;
        }

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
                System.out.println("FOCUS CHANGED");
                if (view.hasFocus()) {
                        view.showDropDown();
                        showing = true;
                } else {
                        view.dismissDropDown();
                        showing = false;
                }
        }

Cosa manca? beh il layout della barra,definito in drawable,assieme alle immagini che vengono descritte nel file (scaricate il progetto per averle!)
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_window_focused="false" android:state_enabled="true"
                android:drawable="@drawable/btn_dropdown_normal" />
        <item android:state_window_focused="false" android:state_enabled="false"
                android:drawable="@drawable/btn_dropdown_disabled" />
        <item android:state_pressed="true" android:drawable="@drawable/btn_dropdown_pressed" />
        <item android:state_focused="true" android:state_enabled="true"
                android:drawable="@drawable/btn_dropdown_selected" />
        <item android:state_enabled="true" android:drawable="@drawable/btn_dropdown_normal" />
        <item android:state_focused="true"
                android:drawable="@drawable/btn_dropdown_disabled_focused" />
        <item android:drawable="@drawable/btn_dropdown_disabled" />
</selector>

Spero di aver fatto cosa gradita a postare il tutorial, aspetto commenti, domande e discussioni costruttive!

Bibliografia:
  • Qualche snippet qui e li :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView
« Risposta #1 il: 20 Novembre 2010, 19:44:27 CET »
0
Cavolo, complimentoni! Questo si che è un tutorial interessante! :D

E grazie per aver condiviso il codice del DropDownMenu! C'è qualche tipo di restrizione per l'utilizzo? Pensi di adottare una licenza in particolare per questo codice?
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Online blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:[Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView
« Risposta #2 il: 20 Novembre 2010, 19:52:24 CET »
0
Gran bel tutorial!
Ovviamente non si applica nel caso di array che possono contenere due elementi uguali, no?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re: [Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView
« Risposta #3 il: 20 Novembre 2010, 21:19:33 CET »
0
Tutto free,è un'idea semplice e comoda ma senza restrizioni,mi basta un grazie ;)
Si si,solo senza duplicati,x quello ci devo pensare e provare!

Sent from my HTC Hero using Tapatalk
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:[Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView
« Risposta #4 il: 07 Dicembre 2011, 13:00:45 CET »
0
salve ragazzi, ottimo tutorial....volevo sapre una cosa io ne dovrei usare più di uno in una activity...c'è il modo di rendere tutto un pò più usabile...tipo creando una classe a parte per rendere il codice più leggibile? ciao e grazie

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:[Facile] Ottenere l'id di un array utilizzato in un'AutocompleteTextView
« Risposta #5 il: 07 Dicembre 2011, 13:23:07 CET »
0
ah ragazzi e se si volesse usare arraylist invece di un array di stringhe...cosa si deve modificare? a me esce la lista e pare funzionare ma quando ci clicco sopra nn funge...qualcuno saprebbe aiutarmi?