3

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

        }

    });         
4

2 に答える 2

6

mHistoryリストを変更するのではなく、を使用して変更することArrayAdapterをお勧めします。add()clear()

adapter.add(mWebView1.getUrl());

また、それが役に立たない場合は、 default の代わりに独自のカスタム アダプターを作成してみてください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();
            }
        }

    }

}
于 2013-04-17T15:38:39.290 に答える