検索ビュー ウィジェットをアクションバーに追加しました。オートコンプリート機能を処理したいと思います。 3文字以上を書き込んだ後、jsonの結果を返し、検索ウィジェットの提案を表示するWebAPIへのhttpリクエストを実行する必要があります。しかし、 documentation では、コンテンツプロバイダーの場合が観察されます。オートコンプリート機能を整理するにはどうすればよいですか?
メニューxmlファイルに検索ビューを追加しました:
<item Android:id="@+id/search"
Android:icon="@drawable/ic_search_white_24dp"
Android:title="Search"
[namespace]:showAsAction="always"
[namespace]:actionViewClass="Android.widget.SearchView" />
検索可能な構成をSearchViewに関連付けます。
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.navigation, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
検索可能な構成を追加しました:
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:label="@string/app_name"
Android:hint="@string/search_hint"
Android:searchSuggestAuthority="com.my.domain.searchable_activity" />
そして最終的には空の責任ある活動を追加しました。
setSearchableInfo()
と検索構成ではこれを行うことはできません。
問題は、SearchView
にはCursorAdapter
が必要であり、データベースではなくサーバーからデータを取得していることです。
しかし、私はこれらのステップで以前にこのようなことをしました:
SearchView
を使用するようにCursorAdapter
を設定します。
searchView.setSuggestionsAdapter(new SimpleCursorAdapter(
context, Android.R.layout.simple_list_item_1, null,
new String[] { SearchManager.SUGGEST_COLUMN_TEXT_1 },
new int[] { Android.R.id.text1 }));
AsyncTask
を作成してサーバーからJSONデータを読み取り、データからMatrixCursor
を作成します。
public class FetchSearchTermSuggestionsTask extends AsyncTask<String, Void, Cursor> {
private static final String[] sAutocompleteColNames = new String[] {
BaseColumns._ID, // necessary for adapter
SearchManager.SUGGEST_COLUMN_TEXT_1 // the full search term
};
@Override
protected Cursor doInBackground(String... params) {
MatrixCursor cursor = new MatrixCursor(sAutocompleteColNames);
// get your search terms from the server here, ex:
JSONArray terms = remoteService.getTerms(params[0]);
// parse your search terms into the MatrixCursor
for (int index = 0; index < terms.length(); index++) {
String term = terms.getString(index);
Object[] row = new Object[] { index, term };
cursor.addRow(row);
}
return cursor;
}
@Override
protected void onPostExecute(Cursor result) {
searchView.getSuggestionsAdapter().changeCursor(result);
}
}
OnQueryTextListener
を設定して、リモートサーバータスクを開始するか、検索アクティビティを開始します。
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String query) {
if (query.length() >= SEARCH_QUERY_THRESHOLD) {
new FetchSearchTermSuggestionsTask().execute(query);
} else {
searchView.getSuggestionsAdapter().changeCursor(null);
}
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
// if user presses enter, do default search, ex:
if (query.length() >= SEARCH_QUERY_THRESHOLD) {
Intent intent = new Intent(MainActivity.this, SearchableActivity.class);
intent.setAction(Intent.ACTION_SEARCH);
intent.putExtra(SearchManager.QUERY, query);
startActivity(intent);
searchView.getSuggestionsAdapter().changeCursor(null);
return true;
}
}
});
OnSuggestionListener
にSearchView
を設定して、検索を実行します。
searchView.setOnSuggestionListener(new OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(position);
String term = cursor.getString(cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1));
cursor.close();
Intent intent = new Intent(MainActivity.this, SearchableActivity.class);
intent.setAction(Intent.ACTION_SEARCH);
intent.putExtra(SearchManager.QUERY, term);
startActivity(intent);
return true;
}
@Override
public boolean onSuggestionClick(int position) {
return onSuggestionSelect(position);
}
});