ユーザ入力によってインタラクティブにリストの内容が絞り込まれるあれ
単純な文字列のリスト
公式Sampleにまんまの例がある.
ArrayAdapterは Filterable を実装しているので,ListViewの側で setOnQueryTextListener と setFilterText を適当に呼んであげれば良い.
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にフィルタをかけると,フィルタ文字列が半透明のポップアップで表示される.
(画像は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");