2010-04-20 7 views
7

Sono nuovo nello sviluppo di Android e mi sono imbattuto in un problema che trovo difficile da risolvere. Sto cercando di capire come utilizzare correttamente un widget AutoCompleteTextView. Voglio creare un AutoCompleteTextView, utilizzando i dati XML da un servizio web. Sono riuscito a farlo funzionare, ma non sono assolutamente contento dell'output.AutoCompleteTextView onItemClick posizione dell'elemento o id utilizzando HashMap

Vorrei inserire un HashMap con id => coppie di nomi nello AutoCompleteTextView e ottenere l'ID dell'elemento selezionato. Quando faccio clic sull'output del filtro con completamento automatico, desidero compilare un elenco sotto la casella del completamento automatico, che è anche riuscito a far funzionare.

fatto finora:

  • completamento automatico funziona bene per semplice ArrayList, tutti i dati filtrati corretta
  • onItemClick generato l'evento correttamente dopo cliccare
  • parent.getItemAtPosition (posizione) restituisce la rappresentazione stringa corretta del fatto clic articolo

L'evento onItemClick (AdapterView padre, Visualizza v, posizione int, ID lungo) non si comporta come vorrei. Come posso capire la posizione dell'array non filtrato dell'elemento cliccato? La posizione di colui filtrato è quello che non mi interessa

Altre domande:.

  • Come gestire HashMaps o collezioni in AutoCompleteTextView
  • Come ottenere il giusto itemId in caso onItemClick

Ho svolto ricerche approfondite su questo argomento, ma non ho trovato alcuna informazione preziosa che avrebbe risposto alle mie domande.

+0

State implementando 'Filterable' e usando i metodi' Filter # performFiltering() 'e' Filter # publishResults() '? – Joe

+0

Anche io sto affrontando lo stesso problema .... pls dare una soluzione amici – sarath

risposta

-1

Come gestire HashMaps o collezioni in AutoCompleteTextView

È possibile impostare il proprio adattatore personalizzato. Nel tuo adattatore spetta a te dove ottieni i dati in una determinata posizione.

Come ottenere il giusto itemId in caso onItemClick

Nella scheda personalizzata, è definire un filtro, e che il filtro imposta le voci suggerite. Hai due elenchi diversi, uno con i valori originali e un altro con gli elementi filtrati. Intendo qualcosa di simile.

private class AutoCompleteItemAdapter extends ArrayAdapter<YourItemClass> implements Filterable { 

    private NameFilter  mFilter; 
    List<YourItemClass> suggestions; 
    List<YourItemClass> mOriginalValues; 

    public AutoCompleteItemAdapter(Context context, int resource, List<YourItemClass> suggestions) { 
     super(context, resource, suggestions); 
     this.suggestions = suggestions; 
     this.mOriginalValues = suggestions; 
    } 

    public void updateData(List<YourItemClass> suggestions) { 
       mLock.lock(); 
       try{ 
        this.suggestions = suggestions; 
         this.mOriginalValues = suggestions; 
      finally{ 
       mLock.unlock(); 
      } 
     } 

    @Override 
    public int getCount() { 
     mLock.lock(); 
     try { 
      return suggestions.size(); 
     } finally { 
      mLock.unlock(); 
     } 
    } 

    @Override 
    public YourItemClass getItem(int position) { 
     return mOriginalValues.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // draw your item here... 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new NameFilter(); 
     } 
     return mFilter; 
    } 

    private class NameFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       mLock.lock(); 
       try { 
        mOriginalValues = new ArrayList<YourItemClass>(suggestions); 
       } finally { 
        mLock.unlock(); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       mLock.lock(); 
       try { 
        ArrayList<YourItemClass> list = new ArrayList<YourItemClass>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } finally { 
        mLock.unlock(); 
       } 
      } else { 
       String prefixString = prefix.toString().toLowerCase(); 

       final List<YourItemClass> values = mOriginalValues; 
       final int count = values.size(); 

       final ArrayList<YourItemClass> newValues = new ArrayList<YourItemClass>(count); 

       //    FILTERING 
       // 
        // add your hits to the newValues collection 
       // 
       // 
       results.values = newValues; 
       results.count = newValues.size(); 
      } 
      return results; 
     } 


     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mLock.lock(); 
      try { 
       if (results == null || results.values == null) return; 
       suggestions = new ArrayList<YourItemClass>(); 
       suggestions = (List<YourItemClass>) results.values; 
       if (results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } finally { 
       mLock.unlock(); 
      } 
     } 
    } 
} 

Ora questo potrebbe sollevare qualche problema di concorrenza, come abbiamo il riferimento, l'adattatore potrebbe chiedere la dimensione della lista, e un valore più grande si spegne, che potrebbe causare problemi nella funzione GetView. (fi .: Il tentativo di disegnare 5 elementi con i dati sottostanti ha solo 4, perché abbiamo fatto un altro filtraggio) Questo è il modo in cui abbiamo usato il nostro AutoCompleteTextView, e finora funziona benissimo, nessun problema. Ho appena detto che sono ancora preoccupato e ho la vaga sensazione che esista una soluzione migliore per questo.

Nel listener onClick, si utilizza il valore restituito (dall'elenco filtrato) come chiave nella mappa e si ottiene il valore associato.Puoi pensare alla tua lista che usi un indice per lo HashMap. Successivamente, puoi utilizzare il tuo Map per disegnare il tuo articolo o per ottenere i tuoi dati.

+0

-1: Questo non risponde alla domanda dell'OP. '... Usi il valore restituito (dall'elenco filtrato) come chiave nella tua mappa ...' - No, no, no. Il * valore * dall'elenco filtrato non è un * tasto *. –