我将TextChangedListener
添加到AutocompleteTextView
。在TextChangedListener
的{{1}}我调用afterTextChanged()
从web加载数据(在活动开始时加载所有数据不是一个选项,因为列表可能非常大,所以它只是浪费交通)。
AsyncTask
的{{1}}看起来像那样(我使用AsyncTask
):
onPostExecute()
ArrayAdapter
是我的自定义对象,覆盖 @Override
protected void onPostExecute(ArrayList<Subregion> result)
{
super.onPostExecute(result);
if (result != null)
{
adapter.clear();
for (Iterator<Subregion> iterator = result.iterator(); iterator.hasNext();)
{
Subregion subregion = iterator.next();
adapter.add(subregion);
}
adapter.notifyDataSetChanged();
autocompleteTextView.showDropDown();
}
}
。
我希望我的程序在用户开始输入时开始加载数据,并在接收和解析它们时立即显示结果。
Subregion
无效。 toString()
收到正确的数据列表,它们会添加到适配器中,但autocompleteTextView.showDropDown()
不会显示下拉列表。怎么了?
答案 0 :(得分:18)
我正在做同样的事情,我刚刚实现了这个功能。 不是清除适配器并单独构建它,而是将适配器设置如下(我在onPostExecute中调用的函数中执行此操作);
//suggestions is a string array of suggestions.
suggestAdapter = new ArrayAdapter<String>(this, R.layout.suggestions, suggestions);
//The autocomplete view
suggestions.setAdapter(this.suggestAdapter);
suggestAdapter.notifyDataSetChanged();
您不需要显式调用showdropdown,当适配器通知它数据已被更改时,自动完成视图会自动更新。
您也可以致电
adapter.setNotifyOnChange(true)
这使得无需调用
adapter.notifyDatasetChanged()
参见setNotifyOnChange 希望我能提供帮助。
答案 1 :(得分:6)
我也遇到过这个问题。我的完成阈值是2.当输入2个字符时,我从服务器获取数据并填充了数组适配器,但autoRailwayFrom.showDropDown();
没有显示下拉...
我只是写在线,它的工作原理......
autoRailwayFrom.setText(autoRailwayFrom.getText());
adapterFrom.notifyDataSetChanged();
autoRailwayFrom.showDropDown();
答案 2 :(得分:1)
这个问题已得到解答,但我认为不是一个好方法 - 关键是所有人都是可过滤的界面。这里有适配器的工作示例,基于BaseAdapter。缺少这里的部分是沟通(我使用了Retrofit):
$('.temas-deco-d').click(function () {
var $this = $(this) // cache jquery `this` object so we don't need to reinstantiate it every time we use it
var script = $this.data('script');
var target = $this.data('target');
var button = $this.data('button');
console.log(script, target, button); // log data to make sure it's correct, remove before deployment
switch (button) {
case 'button1':
$(target).load(script, function() {
twttr.widgets.load();
}).hide().fadeIn("slow");
break;
case 'button2':
$(target).load(script, function() {
FB.XFBML.parse(document.getElementById('div-d'));
twttr.widgets.load();
}).hide();
break;
case 'button3':
$.getScript("jquery.cycle.all.js", function(data, textStatus, jqxhr) {
console.log(data); // Data returned
console.log(textStatus); // Success
console.log(jqxhr.status); // 200
console.log("Load was performed.");
});
break;
}
});
答案 3 :(得分:0)
使用Retroft api调用解决了此问题。 通过在Retrofit的onResponse方法中保留以下代码来解决。不需要在onCreate方法中初始化适配器。 我的代码如下:
productListAdapter = new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_dropdown_item_1line, productList);
autoCompleteTextViewProductSearch.setAdapter(productListAdapter);
productListAdapter.setNotifyOnChange(true);
productListAdapter.notifyDataSetChanged();
autoCompleteTextViewProductSearch.showDropDown();