2013-04-07 113 views
3

我使用ArrayList和ArrayAdapter来记录AutoCompleteTextView的内容,并且我想在列表被修改时动态刷新AutoCompleteTextView。列表的修改是在webviewClient中触发的。为什么我无法动态更新AutoCompleteTextView?

但是,我的代码不起作用。 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(); 

     } 

    });   

回答

2

我想建议你尽量不要修改列表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(); 
      } 
     } 

    } 

} 
0

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

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

据我所知ArrayAdapter需要一个列表(mHistory在你的情况),并把它叫做mOriginalValues。然后根据ACTV中键入的内容对它进行过滤,从mOriginalValues中创建它自己的列表,然后将其插入。

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

相关问题