我想通过从 RESTful Web 服务获取列表来定期更改 AutoCompleteTextview 给出的建议,但无法使其顺利工作。我设置了一个硬编码的建议列表以确保它有效:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, new String[] {"Hi", "Ho"});
speciesName.setAdapter(adapter);//my autocomplete tv
我在文本视图上有一个 TextWatcher,当文本发生变化时,会启动一个非阻塞调用来获取新的建议列表——这部分获取新列表工作正常。然后我想重置适配器,如下所示:
public void setOptionsAndUpdate(String[] options) {
Log.d(TAG, "setting options");
//speciesName.setAdapter((ArrayAdapter<String>)null);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, options);
speciesName.setAdapter(adapter);
}
该方法被调用,但不起作用——建议列表要么消失,要么显示的建议保持不变,尽管调用setAdapter
.
这是正确的方法吗?我在看SimpleCursorAdapter
但不知道如何将我的网络服务注册为内容提供商。 (它的形式http://www.blah.com/query?term=XX http://www.blah.com/query?term=XX,其中 XX 是我的应用程序的输入,响应是 JSON 字符串数组。)
在动态添加和更改适配器中的数据时,我没有使用adapter.notifyDataSetChanged() 的运气。在我的情况下,我异步访问外部 api 并定期获取完成数据列表。
此代码清除适配器,并按您的预期添加新数据。但是,我必须调用 getFilter().Filter 方法来强制显示数据。另外,我必须根据 AutocompleteTextView 中的当前文本显式过滤,因为我的 api 调用是异步的。
adapter.clear();
for (Map<String, String> map : completions) {
adapter.add(map.get("name"));
}
//Force the adapter to filter itself, necessary to show new data.
//Filter based on the current text because api call is asynchronous.
adapter.getFilter().filter(autocompleteTextView.getText(), null);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)