android – 如何动态地向autocompletetextview添加建议并保留字符状态

前端之家收集整理的这篇文章主要介绍了android – 如何动态地向autocompletetextview添加建议并保留字符状态前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题描述:

我在AutoCompleteTextView面临一些问题,我必须在每次按键后显示建议.
事实是,建议列表是像谷歌的建议功能一样动态.
这意味着应该在用户输入时添加新建议,并且应显示所有匹配的旧建议.

例如

我写“te”然后它应该显示之前的建议,如“test1”& “test2”以及我将从Web API获得的新建议.假设web api给了我“茶”字样的信息. “紧张”.

现在,AutoCompleteTextView将“te”作为字符串,其下方显示所有四个建议.

这正是我要找的.

看起来很简单,但它显示出一种奇怪的行为.

我正在使用我在全局声明的默认ArrayAdapter类实例.

  1. arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,suggestions);
  2. word.setAdapter(arrayAdapter);

建议是ArrayList.

从WebApi获得新结果后,我只需致电

  1. arrayAdapter.notifyDataSetChanged();

刷新数据观察者和附加的视图(在我们的例子中是AutoCompleteListView).

但它结束了建议.

当我不使用notifyDataSetChanged();无论我输入的字符是什么,它都会显示所有建议.

我尝试使用自定义过滤器,因为我不能使用notifyDataSetChanged(),但没有一个是有用的.

我发布图片以避免混淆.

我有一个混乱,为什么notifyDataSetChanged();它不起作用.我没有使用具有相同arrayAdapter实例的列表的任何其他引用.我真的怀疑它是否是参考问题.

解决方法

这是最简单的方法之一(将代码放在onCreate中):

编辑:addied wikipedia免费opensearch(如果https://en.wikipedia.org不起作用,请尝试http://en.wikipedia.org)

  1. AutoCompleteTextView actv = new AutoCompleteTextView(this);
  2. actv.setThreshold(1);
  3. String[] from = { "name","description" };
  4. int[] to = { android.R.id.text1,android.R.id.text2 };
  5. SimpleCursorAdapter a = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2,null,from,to,0);
  6. a.setStringConversionColumn(1);
  7. FilterQueryProvider provider = new FilterQueryProvider() {
  8. @Override
  9. public Cursor runQuery(CharSequence constraint) {
  10. // run in the background thread
  11. Log.d(TAG,"runQuery constraint: " + constraint);
  12. if (constraint == null) {
  13. return null;
  14. }
  15. String[] columnNames = { BaseColumns._ID,"name","description" };
  16. MatrixCursor c = new MatrixCursor(columnNames);
  17. try {
  18. String urlString = "https://en.wikipedia.org/w/api.PHP?" +
  19. "action=opensearch&search=" + constraint +
  20. "&limit=8&namespace=0&format=json";
  21. URL url = new URL(urlString);
  22. InputStream stream = url.openStream();
  23. BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
  24. String jsonStr = reader.readLine();
  25. // output ["query",["n0","n1",..],["d0","d1",..]]
  26. JSONArray json = new JSONArray(jsonStr);
  27. JSONArray names = json.getJSONArray(1);
  28. JSONArray descriptions = json.getJSONArray(2);
  29. for (int i = 0; i < names.length(); i++) {
  30. c.newRow().add(i).add(names.getString(i)).add(descriptions.getString(i));
  31. }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. return c;
  36. }
  37. };
  38. a.setFilterQueryProvider(provider);
  39. actv.setAdapter(a);
  40. setContentView(actv,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));

猜你在找的Android相关文章