如何dynamic地将build议添加到autocompletetextview并保留字符状态

问题描述:

我面临着一些AutoCompleteTextView的问题,我必须在每次按键后显示build议。 事情是,build议列表像谷歌的build议function一样dynamic。 这意味着应该在用户一直input的时候添加新的build议,并且显示所有匹配的旧build议。

例如

我写“te”,然后显示以前的build议,如“test1”和“test2”,以及我将从Web API获得的新build议。 假设web API给我词“茶”和“紧张”。

现在AutoCompleteTextView将具有“te”作为string,下面显示了所有四个build议。

这正是我正在寻找的。

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

我正在使用默认的ArrayAdapter类的实例,我声明全球。

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

build议是ArrayList。

从WebApi获得新的结果,我只是打电话

 arrayAdapter.notifyDataSetChanged(); 

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

但它closures了build议。

当我不使用notifyDataSetChanged(); 它显示了所有build议,不pipe我input的字符。

我试图用自定义filter的build议,但没有一个是有用的,因为我不能使用notifyDataSetChanged()。

我张贴图像,以避免混淆。 在这里输入图像描述

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

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

编辑:addied维基百科自由的opensearch(如果https://en.wikipedia.org不工作尝试http://en.wikipedia.org

  AutoCompleteTextView actv = new AutoCompleteTextView(this); actv.setThreshold(1); String[] from = { "name", "description" }; int[] to = { android.R.id.text1, android.R.id.text2 }; SimpleCursorAdapter a = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, from, to, 0); a.setStringConversionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Override public Cursor runQuery(CharSequence constraint) { // run in the background thread Log.d(TAG, "runQuery constraint: " + constraint); if (constraint == null) { return null; } String[] columnNames = { BaseColumns._ID, "name", "description" }; MatrixCursor c = new MatrixCursor(columnNames); try { String urlString = "https://en.wikipedia.org/w/api.php?" + "action=opensearch&search=" + constraint + "&limit=8&namespace=0&format=json"; URL url = new URL(urlString); InputStream stream = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); String jsonStr = reader.readLine(); // output ["query", ["n0", "n1", ..], ["d0", "d1", ..]] JSONArray json = new JSONArray(jsonStr); JSONArray names = json.getJSONArray(1); JSONArray descriptions = json.getJSONArray(2); for (int i = 0; i < names.length(); i++) { c.newRow().add(i).add(names.getString(i)).add(descriptions.getString(i)); } } catch (Exception e) { e.printStackTrace(); } return c; } }; a.setFilterQueryProvider(provider); actv.setAdapter(a); setContentView(actv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

你已经在ArrayAdapter的子类中实现了customefilter,在执行过滤方法中你必须做networking调用并从服务器获取数据。 您可以在主要的数据列表中设置这些数据。