【发布时间】:2015-02-20 22:03:33
【问题描述】:
我有一个有效的可搜索Activity 在ActionBar 的android.support.v7.widget.SearchView 中提交输入后查询远程数据库(在软键盘上输入“Go”)。这很好用,但我最终想在每次SearchView 的文本通过添加或删除字符更改时查询数据库。我的SearchView的初始化代码如下。
SearchFragment.java(上面提到的可搜索Activity的子片段)
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_search, menu);
// Get the searchable.xml data about the search configuration
final SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchInfo = searchManager.getSearchableInfo(getActivity().getComponentName());
// Associate searchable configuration with the SearchView
mSearchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
mSearchView.setSearchableInfo(searchInfo);
mSearchView.requestFocus();
mSearchView.onActionViewExpanded();
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
mSearchListAdapter.clear();
return false;
}
@Override
public boolean onQueryTextChange(String query) {
mSearchListAdapter.clear();
// Execute search ...
return false;
}
});
}
我想这项工作需要在上面的onQueryTextChange(String query) 方法中完成,但我不确定需要调用什么。我想过调用SearchManager 的startSearch 实例方法,但这似乎不是最佳实践。有没有人有任何类型搜索的经验并愿意分享一个有效的解决方案?
更新:
MainActivity.java(可搜索的Activity)
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// Handle the search for a particular musical object
final SearchFragment searchFragment = (SearchFragment) getFragmentManager().findFragmentByTag(SearchFragment.TAG);
String query = intent.getStringExtra(SearchManager.QUERY);
mWebService.searchTracks(query, new Callback<Pager>() {
@Override
public void success(Pager results, Response response) {
Log.d(TAG, "Search response received.");
searchFragment.updateItems(results);
}
@Override
public void failure(RetrofitError retrofitError) {
Log.e(TAG, "Search response failed: " + retrofitError.toString());
}
});
上面的search interface design是谷歌Android团队推荐的。
【问题讨论】:
标签: android search searchview