带有异步建议的AutocompleteTextView不会显示下拉列表

时间:2012-05-28 15:01:11

标签: android autocompletetextview

我将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()不会显示下拉列表。怎么了?

4 个答案:

答案 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();