是的,事实上,这是“正常”用例。您必须记住的是,使用搜索操作栏小部件的片段通常应该是注册它的部分,因为小部件将与该片段一起被销毁。
以下是正确捆绑的方法:
在您的ListFragment 中告知您有选项菜单项...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
..
setHasOptionsMenu(true);
..
}
然后在同一个ListFragment 中通过覆盖回调创建您的选项菜单,一旦您拥有 SearchView 小部件引用,注册一个 QueryTextListener 回调:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.grid_default, menu);
SearchView searchView = (SearchView)menu.findItem(R.id.grid_default_search).getActionView();
searchView.setOnQueryTextListener(queryListener);
}
通过编程方式 (Java) 或声明方式 (XML) 创建您的搜索小部件,这里是 XML(命名为 grid_default.xml,来自上面):
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/grid_default_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"
/>
<!-- other items or whatever -->
</menu>
现在回到您的ListFragment,您需要创建我们在上面注册的queryListener:
private String grid_currentQuery = null; // holds the current query...
final private OnQueryTextListener queryListener = new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
getActivity().getActionBar().setSubtitle("List");
grid_currentQuery = null;
} else {
getActivity().getActionBar().setSubtitle("List - Searching for: " + newText);
grid_currentQuery = newText;
}
getLoaderManager().restartLoader(0, null, MyListFragment.this);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(getActivity(), "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
return false;
}
};
现在您知道查询何时更改或提交,在我的示例中,我会在每次按下某个键时重新查询,因为我的数据库很小且结果很快,您可能需要更改此设置.. 但您会注意到我如何使用小部件将ListFragment 中的私有类字段设置为搜索小部件的当前文本(grid_currentQuery),然后我只是调用getLoaderManager().restartLoader(0, null, MyListFragment.this); 在我的onCreateLoader 里面我只是在更新我这样使用的查询:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bargs) {
String sort = "SortColumn ASC";
String[] grid_columns = new String[] { "ColumnA", "ColumnB", "Etc..." };
String grid_whereClause = "ColumnToSearchBy LIKE ?"
if (!TextUtils.isEmpty(grid_currentQuery)) {
return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, grid_whereClause, new String[] { grid_currentQuery + "%" }, sort);
}
return new CursorLoader(getActivity(), DataProvider.CONTENT_URI, grid_columns, null, null, sort);
}
这就是你真正需要做的,我意识到这有点被切碎了,但就是这样,因为还有更多的事情需要发生,设置适配器,首先使用 getLoaderManager().initLoader(0, null, this); 启动加载器和需要处理的所有其余加载程序回调...但是如果您遵循 android 人员提出的最佳实践,(在您的 ListActivitys 和 ListFragmentss 中使用 LoaderManagers 它应该是对你来说很容易......
如果您需要 -ck,我希望这有助于随时在 cmets 中要求澄清