8

我添加TextChangedListenerAutocompleteTextView. 在TextChangedListener'safterTextChanged()我调用AsyncTaskwhich 从 web 加载数据(在活动开始时加载所有数据不是一个选项,因为列表可能非常大,所以它只是浪费流量)。 AsyncTaskonPostExecute()样子(我用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()没有效果。onPostExecute()接收到正确的数据列表,它们被添加到适配器,但showDropDown()不显示下拉列表。怎么了?

4

4 回答 4

19

我正在做同样的事情,我刚刚实现了这个功能。不要清除适配器并单独构建它,而是如下设置适配器(我在 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 希望我能有所帮助。

于 2012-05-29T13:49:46.753 回答
6

我也遇到过这个问题。我的完成阈值为 2。当输入 2 个字符时,我正在从服务器获取数据并填写了数组适配器,但autoRailwayFrom.showDropDown();没有显示下拉菜单...

我只是在网上写,它可以工作......

autoRailwayFrom.setText(autoRailwayFrom.getText());
adapterFrom.notifyDataSetChanged();
autoRailwayFrom.showDropDown();
于 2013-02-23T18:28:12.360 回答
1

这个问题已经得到了回答,但我认为这不是一个好的方式 - 所有人的关键是可过滤的界面。在这里,您有基于 BaseAdapter 的适配器的工作示例。这里缺少的部分是沟通(我使用了改造):

public class UsersAutoAdapter extends BaseAdapter implements Filterable
{
    {
        DaggerGraphManager.INSTANCE.inject(this);
    }

    @Inject
    CommunicationManager mCommunicationManager;

    private FindUserResponse mFindUserResponse;

    @Override
    public int getCount()
    {
        if (mFindUserResponse != null && mFindUserResponse.mUsers != null)
        {
            return mFindUserResponse.mUsers.size();
        }

        return 0;
    }

    @Override
    public Object getItem(int i)
    {
        return mFindUserResponse.mUsers.get(i);
    }

    @Override
    public long getItemId(int i)
    {
        return i;
    }

    @Override
    public View getView(int i, View pView, ViewGroup pViewGroup)
    {
        if (pView == null)
        {
            LayoutInflater inflater = LayoutInflater.from(pViewGroup.getContext());
            pView = inflater.inflate(R.layout.ac_item_user, pViewGroup, false);
        }
        TextView textViewUserName = (TextView) pView.findViewById(R.id.text_view_user_name);
        textViewUserName.setText(mFindUserResponse.mUsers.get(i).mUserName);


        return pView;
    }

    @Override
    public Filter getFilter()
    {
        return new Filter()
        {
            //this method is called async (not from UI thread!) so making network request is possible here
            @Override
            protected FilterResults performFiltering(CharSequence pCharSequence)
            {

                if (pCharSequence != null && pCharSequence.length() >= 3)
                {
                    FindUserResponse users = mCommunicationManager.findUsersSync(pCharSequence.toString());

                    FilterResults results = new FilterResults();

                    results.values = users;
                    results.count = users.mUsers.size();

                    return results;
                }
                return null;
            }

            //this is UI thread called method (just after performFiltering returns it's results
            @Override
            protected void publishResults(CharSequence pCharSequence, FilterResults pFilterResults)
            {
                if (pFilterResults != null)
                {
                    mFindUserResponse = (FindUserResponse) pFilterResults.values;
                    notifyDataSetInvalidated();
                }
            }
        };
    }
}
于 2015-08-04T15:58:08.403 回答
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();
于 2019-07-03T19:30:01.237 回答