Androidに検索機能とリスト表示を追加する方法
検索結果ページのアクションバー
- Android 3.0を用意する。AndroidはSearchViewウェジットをアクションバーに追加する機能をサポートしています。この検索結果ページはリスト表示機能にも使えます。
SearchView に関する詳細はこちら
http://developer.android.com/training/search/setup.html
- ここから先は検索可能なリスト表示の実装方法です
メニュー検索を追加する
- メニューに必要なリソースを検索メニューアイテムとと一緒に用意する。(検索メニューアイテムを選択すると、検索ウェジットがアクションバーに表示されます)
- 下記はサンプルのメニューリソースです。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="Search"
android:icon="@drawable/search"
android:showAsAction="collapseActionView|ifRoom"
android:actionViewClass="android.widget.SearchView" />
</menu>
- 上記のcollapseActionView属性のメニューアイテムは、SearchViewがアクションバーに広がり、使用していないときは通常のアクションバーアイテムの状態に戻ります。
検索可能な設定を作る
- Searchable ConfigurationはSearchViewがどのように動くか定義します。 xml(res/xml/searchable.xml)の形で定義付けする必要があります。下記がサンプルのsearchable configurationファイルです。
<?xml version="1.0" encoding="utf-8"?>
<searchable
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="Search friend">
</searchable>
- そして、アクションに関連する要素を<meta-data> と一緒に追加します。
<activity
android:name=".ui.FriendListActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:theme="@style/Theme.Yello"
android:windowSoftInputMode="stateHidden"
android:launchMode="singleTask"
android:parentActivityName=".ui.SensorDetailsActivity">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable">
</meta-data>
</activity>
- シナリオ例として、SearchViewにFriendListActivityを追加します。
activityにSearchableConfigurationとメニューを追加する
- activityクラスにsearchable configurationとSearchView を関連付けします。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_menu, menu);
SearchManager searchManager = (SearchManager)
getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.
getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
return true;
}
- これでActivityにSearchViewが追加されました。しかし検索機能は完全に機能していません
検索機能を追加する
- ActivityにSearchView.OnQueryTextListenerを実装します。2つの新しいメソッドにオーバーライドする必要があります。
public boolean onQueryTextSubmit(String query)
public boolean onQueryTextChange(String newText)
- このインターフェースはSearchViewのText Change Eventに影響されます
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
friendListAdapter.getFilter().filter(newText);
return true;
}
- onQueryTextChangeの機能はリストアダプターのフィルタリングを実行します。フィルタリングを実行するには、アダプターにFilterableインターフェースを実装する必要があります。
- 下記リンク先はFriendListActivity対応する実装リストです。 https://github.com/erangaeb/dev-notes/blob/master/android-search-list/FriendListActivity.java
フィルタリングできるアダプター
- Filterable実装されたBaseAdapterを使います。
- 下記はアダプタープラス(FriendListAdapter)です。 https://github.com/erangaeb/dev-notes/blob/master/android-search-list/FriendListAdapter.java
- フィルタリングするために、FriendFilterにカスタムフィルターを設定します。 ここで2つの配列リストを定義しています。 1つはリストビューでの表示用、もう1つはフィルタリング用のものです。
// original list, filtering do with this list
private ArrayList<User> friendList;
// filtered list construct by filtering the friendList
// it uses to create the list view
private ArrayList<User> filteredList;
- 検索機能が使えるようになります。アウトプットのサンプルです。
プログラムでSearchViewを折りたたむ
* リストアイテムが選択された後に、新しいActivity ShareActivityにナビゲートします。
* ナビゲート中に、SearchViewを折りたたみます。
private void handelListItemClick(User user) {
// close search view if its visible
if (searchView.isShown()) {
searchMenuItem.collapseActionView();
searchView.setQuery("", false);
}
// pass selected user and sensor to share activity
Intent intent = new Intent(this, ShareActivity.class);
intent.putExtra("com.score.senzors.pojos.User", user);
this.startActivity(intent);
this.overridePendingTransition(R.anim.right_in, R.anim.stay_in);
}
検索クエリ入力中にポップアップテキストを表示する
* リスト表示のフィルタリングをONにします。
friendListView.setTextFilterEnabled(true);
- onQueryTextChangeを下記のように設定します。 @Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
friendListView.clearTextFilter();
}
else {
friendListView.setFilterText(newText.toString());
}
return true;
}
- これでsearchviewがポップアップして表示されます。これはそのままSearchViewに入録している文字がそのまま表示されます。
ソースコードの完全版はこちら
https://github.com/erangaeb/dev-notes/tree/master/android-search-list
Written by STK
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Search
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#