android.widget.ArrayAdapterでのフィルタリングの拡張

2012-02-28T00:00:00+00:00 Android Java

Quick Search Box関係を調べていて勉強しているとふと思ったのが、クエリーによる検索をするのは良いけど例えばフィルターをする実際の処理を自分で実装した場合とかどうするのって思った。というかどうやらデフォルトのAdapterのフィルターだと検索キーワードをトークンで分割してフィルタしてくれない模様なんだけど。という事でフィルタ処理を自分で処理する方法を調べた所だと、Adapterとそれが使用するFilterオブジェクトを拡張してやれば良いらしい

package sample.test;

import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.StringTokenizer;
import java.util.TreeSet;

import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;

public class SampleArrayAdapter extends ArrayAdapter<String> {

    private Filter filter;
    private List<String> items = new ArrayList<String>();

    public SampleArrayAdapter(Context ctx) {
        super(ctx, android.R.layout.simple_list_item_1);

        // ここら辺なりで(itemsとAdapterコンテナに)データを突っ込む。
    }

    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new SampleFilter();
        }

        // 自前なFilterオブジェクトを返すようにする

        return filter;
    }

    private class SampleFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            //List<String> filterItems = new ArrayList<String>();
            SortedSet<String> filterItems = new TreeSet<String>();

            // ここらでクエリーからフィルターして(filterItemsに)データ突っ込む

            results.values = filterItems;
            results.count = filterItems.size();

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            @SuppressWarnings("unchecked")
            // List<String> filters = (List<String>)results.values;
            SortedSet<String> filters = (SortedSet<String>)results.values;

            notifyDataSetChanged();
            clear(); // 一度データ削除する

            // フィルターしたデータを突っ込む

            for (String filter : filters) {
                add(filter);
            }
        }
    }
}

色々とおかしい部分があるけど

まぁperformFilteringとpublishResultsを実装したFilterを作って、Adapterでそれを返す事で独自のフィルタリング処理をぶっこめるっぽいっすね

WebKit JavaScriptCoreで遊んでみる Perl(Protocol::WebSocket)にJava(weberknecht)でつなぐ