LoginSignup
16
20

More than 5 years have passed since last update.

ListViewの内容をフィルタリングするメモ

Posted at

ユーザ入力によってインタラクティブにリストの内容が絞り込まれるあれ

単純な文字列のリスト

公式Sampleにまんまの例がある.
ArrayAdapterは Filterable を実装しているので,ListViewの側で setOnQueryTextListenersetFilterText を適当に呼んであげれば良い.

SearchViewFilterMode.javaから適当に編集引用
public class SearchViewFilterMode extends Activity implements SearchView.OnQueryTextListener {
    protected void onCreate(Bundle savedInstanceState) {
        // (省略)
        mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                mStrings));
        mListView.setTextFilterEnabled(true);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setSubmitButtonEnabled(false);
    }

    public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            mListView.clearTextFilter();
        } else {
            mListView.setFilterText(newText.toString());
        }
        return true;
    }

    public boolean onQueryTextSubmit(String query) {
        return false;
    }

ArrayAdapterにString以外を入れたい

文字だけのリストではなくて,アイコン等を含めるために自分の定義したオブジェクトを渡したいことがある.

androidでArrayAdapterを使う - @blog.justoneplanet.info

上記URLより,このときの注意点は以下の二点
- ArrayAdapter#getView をオーバライドするときは getItem(position メソッドによって position に対応する要素を取得する
- データクラスの toString() がフィルタに利用されるので, toString() を適切にオーバライドする

ポップアップで入力内容が表示させるのを無効化する

上述の方法でそのままListViewにフィルタをかけると,フィルタ文字列が半透明のポップアップで表示される.
filter_popup.png
(画像はStack Overflowより)

ワークアラウンドはいくつかありそうだけど, ListView#setFilterText を呼ぶ代わりに,直接Filterオブジェクトを操作するのが良さそうだ.(参考: http://stackoverflow.com/questions/7999083/how-do-i-remove-popup-text-from-listview-filter)

Filter filter = ((Filterable) listView.getAdapter()).getFilter();
filter.filter("search string");
16
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
20