【问题标题】:Why can't I update the AutoCompleteTextView dynamically?为什么我不能动态更新 AutoCompleteTextView?
【发布时间】:2013-03-29 11:13:15
【问题描述】:

我使用一个ArrayList和一个ArrayAdapter来记录AutoCompleteTextView的内容,我想在修改列表时动态刷新AutoCompleteTextView。列表的修改是在 webviewClient 中触发的。

但是,我的代码不起作用。 AutoCompleteTextView 只能在重新加载整个活动时更新。根本没有动态更新。谁能帮我找出问题所在?

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mHistory); //mHistory is the list of data
    adapter.setNotifyOnChange(true);
    mEditText1.setAdapter(adapter); //mEditText1 is the AutoCompleteTextView

    mWebView1.setWebViewClient(new WebViewClient() {

        public void onPageFinished(WebView view, String url){
            super.onPageFinished(view, url);

            if (!mHistory.contains(mWebView1.getUrl())){
                mHistory.add(mWebView1.getUrl());
                writeList(view.getContext(), mHistory, "history");  //this is to store the list elsewhere
            }
            adapter.notifyDataSetChanged();

        }

    });         

【问题讨论】:

标签: android adapter autocompletetextview


【解决方案1】:

我建议您尽量不要修改您的列表mHistory,而是使用add()clear() 等来修改您的ArrayAdapter

adapter.add(mWebView1.getUrl());

另外,如果这没有帮助,您可以尝试创建自己的自定义适配器,而不是默认的 ArrayAdapter。您可以在需要时通过公共函数callFiltering 强制过滤自定义适配器可能是这样的:

public class CustomArrayAdapter extends ArrayAdapter<String> implements
        Filterable {
    private List<String> list;
    private CustomFilter customFilter;

    public CustomArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        list = new ArrayList<String>();
    }

    @Override
    public void add(String object) {
        list.add(object);
        notifyDataSetChanged();
    }

    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public String getItem(int position) {
        return list.get(position);
    }

    @Override
    public CustomFilter getFilter() {
        if (customFilter == null) {
            customFilter = new CustomFilter();
        }
        return customFilter;
    }

    public void callFiltering(String term) {
        customFilter.performFiltering(term);
    }

    private class CustomFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (constraint != null) {
                results.values = list;
                results.count = list.size();
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }

    }

}

【讨论】:

    【解决方案2】:

    如果添加行:

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mHistory);
    

    adapter.notifyDataSetChanged(); 之前,它应该可以工作。

    据我所知,ArrayAdapter 接收一个列表(在您的情况下为 mHistory)并将其称为 mOriginalValues。然后根据在 ACTV 中输入的内容进行过滤,从 mOriginalValues 创建它自己的列表,然后显示。

    adapter.notifyDataSetChanged() 指的是过滤后的列表,而不是 mOriginalValues。因此,您必须制作一个新适配器并将新列表提供给它。

    【讨论】:

    • 每次都创建适配器真是太糟糕了。
    猜你喜欢
    • 2011-04-23
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2021-07-01
    • 2021-12-11
    相关资源
    最近更新 更多