How to use AutoCompleteTextView and populate it with data from the web API?

I want to use AutoCompleteTextView in my activity and populate data as user types by requesting a web API. How should I do it?

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

Or is there a better way to get my ultimate goal?

I did something similar, but it was for the quick search box, and this is due to the implementation of the service, but I think that is not what I want to do here.

+79
android filter networking autocompletetextview
Feb 16 2018-11-11T00:
source share
4 answers

I came up with a solution, I don’t know if this is the best solution, but it works very well. I created a custom adapter that extends the ArrayAdapter. In the user adapter, I overridden getFilter and created my own Filter class, which overrides the performFiltering function. This will start a new thread so that it does not interrupt the user interface. Below is an example with barebones.

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; } } 
+94
Feb 19 '11 at 2:05 p.m.
source share

Turning around on AJ. , answer above, the following user adapter includes server request processing and json analysis:

 class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { private ArrayList<String> data; private final String server = "http://myserver/script.php?query="; AutoCompleteAdapter (@NonNull Context context, @LayoutRes int resource) { super (context, resource); this.data = new ArrayList<>(); } @Override public int getCount() { return data.size(); } @Nullable @Override public String getItem (int position) { return data.get (position); } @NonNull @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering (CharSequence constraint) { FilterResults results = new FilterResults(); if (constraint != null) { HttpURLConnection conn = null; InputStream input = null; try { URL url = new URL (server + constraint.toString()); conn = (HttpURLConnection) url.openConnection(); input = conn.getInputStream(); InputStreamReader reader = new InputStreamReader (input, "UTF-8"); BufferedReader buffer = new BufferedReader (reader, 8192); StringBuilder builder = new StringBuilder(); String line; while ((line = buffer.readLine()) != null) { builder.append (line); } JSONArray terms = new JSONArray (builder.toString()); ArrayList<String> suggestions = new ArrayList<>(); for (int ind = 0; ind < terms.length(); ind++) { String term = terms.getString (ind); suggestions.add (term); } results.values = suggestions; results.count = suggestions.size(); data = suggestions; } catch (Exception ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (Exception ex) { ex.printStackTrace(); } } if (conn != null) conn.disconnect(); } } return results; } @Override protected void publishResults (CharSequence constraint, FilterResults results) { if (results != null && results.count > 0) { notifyDataSetChanged(); } else notifyDataSetInvalidated(); } }; } 

and use it in the same way:

 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { ... AutoCompleteTextView textView = (AutoCompleteTextView) findViewById (R.id.style); int layout = android.R.layout.simple_list_item_1; AutoCompleteAdapter adapter = new AutoCompleteAdapter (this, layout); textView.setAdapter (adapter); } } 
+5
Apr 25 '17 at 16:55
source share

Chu: To customize the appearance of the view and gain more control over the deployment of an object, do the following ...

  @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; } 
+3
Apr 22 '11 at 4:13
source share
 private AutoCompleteUserAdapter userAdapter; private AutoCompleteTextView actvName; private ArrayList<SearchUserItem> arrayList; actvName = findViewById(R.id.actvName); actvName.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { actvName.setText(userAdapter.getItemNameAtPosition(position)); actvName.setSelection(actvName.getText().toString().trim().length()); } }); actvName.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(final CharSequence s, int start, int before, int count) { if (actvName.isPerformingCompletion()) { // An item has been selected from the list. Ignore. } else { if (s.toString().toLowerCase().trim().length() >= 2) { getUserList(s.toString().toLowerCase().trim()); } } } @Override public void afterTextChanged(Editable s) { } }); private void getUserList(String searchText) { //Add data to your list after success of API call arrayList = new ArrayList<>(); arrayList.addAll(YOUR_LIST); userAdapter = new AutoCompleteUserAdapter(context, R.layout.row_user, arrayList); getActivity().runOnUiThread(new Runnable() { @Override public void run() { actvName.setAdapter(userAdapter); userAdapter.notifyDataSetChanged(); actvName.showDropDown(); } }); } 

AutoCompleteUserAdapter

 /** * Created by Ketan Ramani on 11/07/2019. */ public class AutoCompleteUserAdapter extends ArrayAdapter<SearchUserItem> { private Context context; private int layoutResourceId; private ArrayList<SearchUserItem> arrayList; public AutoCompleteUserAdapter(Context context, int layoutResourceId, ArrayList<SearchUserItem> arrayList) { super(context, layoutResourceId, arrayList); this.context = context; this.layoutResourceId = layoutResourceId; this.arrayList = arrayList; } @Override public View getView(int position, View convertView, ViewGroup parent) { try { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(layoutResourceId, parent, false); } SearchUserItem model = arrayList.get(position); AppCompatTextView tvUserName = convertView.findViewById(R.id.tvUserName); tvUserName.setText(model.getFullname()); } catch (NullPointerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return convertView; } public String getItemNameAtPosition(int position) { return arrayList.get(position).getName(); } public String getItemIDAtPosition(int position) { return arrayList.get(position).getId(); } } 
0
Jul 11 '19 at 12:49
source share



All Articles