您的位置:首页 > 其它

将SeachView添加到ActionBar中实现搜索功能

2018-03-29 10:34 176 查看
    主要功能:在已获取的appList中实时搜索与app名相匹配的结果

      ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。

    为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件,例如可以使用如下方式添加SearchView。

menu_main.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/search"
android:visible="false"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>    在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了,MainActivity.java部分代码如下所示:@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);

searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

return true;
}在这里注册了事件监听器,重写方法
onQueryTextSubmit(String query)   
onQueryTextChange(String search)
MainActivity.java部分代码如下:@Override
public boolean onQueryTextChange(String search) {
if (search.isEmpty()) {
((AppAdapter) recyclerView.getAdapter()).getFilter().filter("");
} else {
((AppAdapter) recyclerView.getAdapter()).getFilter().filter(search.toLowerCase());
}

return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

其中AppAdapter.java部分代码如下:public class AppAdapter extends RecyclerView.Adapter<AppAdapter.AppViewHolder> implements Filterable {
···
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
final FilterResults oReturn = new FilterResults();
final List<AppInfo> results = new ArrayList<>();
if (appListSearch == null) {
appListSearch = appList;
}
if (charSequence != null) {
if (appListSearch != null && appListSearch.size() > 0) {
for (final AppInfo appInfo : appListSearch) {
if (appInfo.getName().toLowerCase().contains(charSequence.toString())) {
results.add(appInfo);
}
}
}
oReturn.values = results;
oReturn.count = results.size();
}
return oReturn;
}

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
if (filterResults.count > 0) {
MainActivity.setResultsMessage(false);
} else {
MainActivity.setResultsMessage(true);
}
appList = (ArrayList<AppInfo>) filterResults.values;
notifyDataSetChanged();
}
};
}
}
4000
MainActivity.java部分代码如下:public static void setResultsMessage(Boolean result) {
if (result) {
noResults.setVisibility(View.VISIBLE);
fastScroller.setVisibility(View.GONE);
} else {
noResults.setVisibility(View.GONE);
fastScroller.setVisibility(View.VISIBLE);
}
}其中实体类AppInfo部分代码:public class AppInfo implements Serializable {
//apk名称
private String name;
//包名
private String apk;
//版本号
private String version;
//图标
private Drawable icon;
//是否为系统apk
private Boolean system;
···
getter and setter方法略
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: