87 votes

Comment utiliser AutoCompleteTextView et le renseigner avec les données d'une API Web?

Je veux utiliser un AutoCompleteTextView de mon activité et de remplir les données que l'utilisateur tape par interrogation d'une API web. Comment dois-je faire?

Dois-je créer une nouvelle classe et substituer AutoCompleteTextView.performFiltering, ou dois-je utiliser une liste personnalisée de carte et de fournir une coutume android.widget.Filter qui remplace performFiltering?

Ou est-il une meilleure façon d'obtenir mon objectif final?

J'ai fait quelque chose d'un peu similaire, mais c'était pour la zone de Recherche Rapide et il a impliqué la mise en œuvre d'un service, mais je crois que ce n'est pas ce que je veux faire ici.

107voto

AJ. Points 882

Je suis venu avec une solution, je ne sais pas si c'est la meilleure solution, mais cela semble très bien fonctionner. Ce que j'ai fait a été créé par un adaptateur personnalisé qui étend ArrayAdapter. Dans l'adaptateur personnalisé, j'ai remplacé getFilter et créé ma propre classe Filter qui remplace performFiltering. Cela démarre un nouveau thread afin d’interrompre l’interface utilisateur. Vous trouverez ci-dessous un exemple à nu.

MyActivity.java

 public class MyActivity extends Activity {
    private AutoCompleteTextView style;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        style = (AutoCompleteTextView) findViewById(R.id.style);
        adapter = new AutoCompleteAdapter(this, android.R.layout.simple_dropdown_item_1line); 
        style.setAdapter(adapter);
    }
}
 

AutoCompleteAdapter.java

 public class AutoCompleteAdapter extends ArrayAdapter<Style> implements Filterable {
    private ArrayList<Style> mData;

    public AutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mData = new ArrayList<Style>();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Style getItem(int index) {
        return mData.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if(constraint != null) {
                    // A class that queries a web API, parses the data and returns an ArrayList<Style>
                    StyleFetcher fetcher = new StyleFetcher();
                    try {
                        mData = fetcher.retrieveResults(constraint.toString());
                    }
                    catch(Exception e) {
                        Log.e("myException", e.getMessage());
                    }
                    // Now assign the values and count to the FilterResults object
                    filterResults.values = mData;
                    filterResults.count = mData.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence contraint, FilterResults results) {
                if(results != null && results.count > 0) {
                notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return myFilter;
    }
}
 

3voto

Daniel Points 73

Chu: Pour personnaliser l'apparence de la vue et mieux contrôler le déroulement de l'objet, procédez comme suit ...

     @Override
    public View getView (int position, View convertView, ViewGroup parent) {
        TextView originalView = (TextView) super.getView(position, convertView, parent); // Get the original view

        final LayoutInflater inflater = LayoutInflater.from(getContext());
        final TextView view = (TextView) inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);

        // Start tweaking
        view.setText(originalView.getText());
        view.setTextColor(R.color.black);  // also useful if you have a color scheme that makes the text show up white
        view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10); // override the text size
        return view;
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X