Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I Use AutoCompleteTextView and populate it with data from a web API?

I want to use an AutoCompleteTextView in my activity and populate the data as the user types by querying a web API. How do I go about doing this?

Do I create a new class and override AutoCompleteTextView.performFiltering, or do I use a custom list adapter and provide a custom android.widget.Filter that overrides performFiltering?

Or is there a better way to obtain my end goal?

I've done something somewhat similar, but it was for the Quick Search box and it involved implementing a service, but I believe that's not what I want to do here.

like image 754
AJ. Avatar asked Feb 16 '11 23:02

AJ.


1 Answers

I came up with a solution, I don't know if it is the best solution, but it appears to work very well. What I did was created a custom adapter that extends ArrayAdapter. In the custom adapter I overrode getFilter and created my own Filter class that overrides performFiltering. This starts a new thread so it doesn't interrupt the UI. Below is a barebones example.

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;     } } 
like image 86
AJ. Avatar answered Oct 13 '22 05:10

AJ.