是的,事实上,那是“正常”的使用情况。您需要记住的是,使用搜索操作栏小部件的片段应该是通常注册它的部分,因为该小部件将随着该片段而被销毁。
以下是正确绑定的方法:
在您的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"
/>
</menu>
现在回到你的ListFragment
,你需要创建我们之前注册的queryListener
:
private String grid_currentQuery = null;
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;
}
};
现在你知道当查询被更改或提交时的情况了,在我的示例中,每当按键被按下,我会重新查询,因为我的数据库非常小而且结果很快,你可能需要更改它.. 但是你会注意到我只是使用小部件将当前搜索小部件的文本(grid_currentQuery
)设置为私有类字段(ListFragment
),然后我只是调用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开发者提出的最佳实践(在ListActivity
和ListFragments
中使用LoaderManager
),那么这应该对你来说非常容易...
希望这可以帮助你,如果需要澄清,请随时在评论中提问-ck