2010-04-20 8 views
7

Je suis nouveau sur le développement Android et j'ai rencontré un problème que je trouve difficile à résoudre. J'essaie de comprendre comment utiliser un widget AutoCompleteTextView correctement. Je veux créer un AutoCompleteTextView, en utilisant les données XML d'un service Web. J'ai réussi à le faire fonctionner, mais je ne suis définitivement pas satisfait de la sortie.AutoCompleteTextView onItemClick position de l'article ou ID en utilisant HashMap

Je voudrais mettre un HashMap avec des paires id => name dans le AutoCompleteTextView et obtenir l'ID de l'article cliqué. Lorsque je clique sur la sortie de l'ensemble filtré de saisie semi-automatique, je veux remplir une liste sous la zone de saisie semi-automatique, que j'ai également réussi à utiliser.

fait jusqu'à présent:

  • autocomplete fonctionne bien pour ArrayList simple, toutes les données filtrées correctes
  • événement se déclenche onItemClick correctement après cliquez sur
  • parent.getItemAtPosition (position) retourne correcte représentation de chaîne de la cliquée article

L'événement onItemClick (parent de AdapterView, Vue v, position int, long id) ne se comporte pas comme je le voudrais. Comment puis-je déterminer la position du tableau non filtré de l'élément cliqué? La position de celle filtrée est celui que je ne suis pas intéressé par

D'autres questions:.

  • Comment gérer HashMaps ou Collections dans AutoCompleteTextView
  • Comment obtenir le droit itemId en cas onItemClick

J'ai fait des recherches très approfondies sur ce sujet, mais je n'ai trouvé aucune information utile pour répondre à mes questions.

+0

Implémentez-vous 'Filterable' et utilisez les méthodes' Filter # performFiltering() 'et' Filter # publishResults() '? – Joe

+0

Je suis également confronté au même problème .... pls donner une solution amis – sarath

Répondre

-1

Comment gérer HashMaps ou Collections dans AutoCompleteTextView

Vous pouvez définir votre propre adaptateur personnalisé. Dans votre adaptateur, c'est à vous de choisir où vous voulez placer vos données dans une position donnée.

Comment obtenir le droit itemId en cas onItemClick

Dans votre adaptateur personnalisé, vous définissez un filtre, et que le filtre fixe les éléments proposés. Vous avez deux listes différentes, une avec les valeurs d'origine et une autre avec les éléments filtrés. Je veux dire quelque chose comme ça.

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(); 
      } 
     } 
    } 
} 

Maintenant, cela pourrait soulever des problème de concurrence, comme nous la référence, l'adaptateur peut demander la taille de la liste, et une valeur plus grande sort, ce qui pourrait causer des problèmes dans la fonction getView. (fi: Tenter de dessiner 5 éléments avec les données sous-jacentes a seulement 4, parce que nous avons fait un autre filtrage) Ceci de la façon dont nous avons utilisé notre AutoCompleteTextView, et jusqu'à présent cela fonctionne très bien, pas de problème. Je viens de dire que je suis toujours préoccupé et j'ai le vague sentiment qu'il existe une meilleure solution pour cela.

Dans votre programme d'écoute onClick, vous utilisez la valeur renvoyée (à partir de la liste filtrée) comme clé dans votre carte et obtenez la valeur associée.Vous pouvez penser que votre liste vous utilisez un index pour le HashMap. Après cela, vous pouvez utiliser votre Map pour dessiner votre objet, ou pour obtenir vos propres données.

+0

-1: Cela ne répond pas à la question de l'OP. '... Vous utilisez la valeur renvoyée (à partir de la liste filtrée) comme la clé de votre carte ...' - Non, non, non. La * valeur * de la liste filtrée n'est pas une * clé *. –

Questions connexes