Comment utiliser AutoCompleteTextView et le remplir avec des données provenant d’une API Web?

Je souhaite utiliser un AutoCompleteTextView dans mon activité et renseigner les données en tant qu’utilisateur en interrogeant une API Web. Comment vais-je faire ça?

Dois-je créer une nouvelle classe et remplacer AutoCompleteTextView.performFiltering ou est-ce que j’utilise un adaptateur de liste personnalisé et fournir un android.widget.Filter personnalisé qui remplace performFiltering?

Ou existe-t-il un meilleur moyen d’obtenir mon objective final?

J’ai fait quelque chose de similaire, mais c’était pour la boîte de recherche rapide et cela impliquait l’implémentation d’un service, mais je crois que ce n’est pas ce que je veux faire ici.

J’ai trouvé une solution, je ne sais pas si c’est la meilleure solution, mais cela semble très bien fonctionner. J’ai créé un adaptateur personnalisé qui étend ArrayAdapter. Dans l’adaptateur personnalisé, j’ai remplacé getFilter et créé ma propre classe Filter qui remplace performFiltering. Cela commence un nouveau thread afin qu’il n’interrompt pas l’interface utilisateur. Voici un exemple de 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 

Expansion sur AJ. La réponse ci-dessus, l’adaptateur personnalisé suivant inclut le traitement des requêtes du serveur et l’parsing json également:

 class AutoCompleteAdapter extends ArrayAdapter implements Filterable { private ArrayList data; private final Ssortingng 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 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(); } }; } 

et l’utiliser de la même manière:

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

Chu: Pour personnaliser l’apparence de la vue et obtenir plus de contrôle sur le déroulage de l’object, 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; }