2013-04-07 114 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。所以你必須製作一個新的適配器並將它提供給新的列表。

相關問題