将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;
}在这里注册了事件监听器,重写方法
public boolean onQueryTextChange(String search) {
if (search.isEmpty()) {
((AppAdapter) recyclerView.getAdapter()).getFilter().filter("");
} else {
((AppAdapter) recyclerView.getAdapter()).getFilter().filter(search.toLowerCase());
}
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方法略
}
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方法略
}
相关文章推荐
- 给文本框添加模糊搜索功能(“我记录”MVC框架下实现)
- Android RecyclerView 获取数据实现添加,删除功能
- actionBar+SearchView实现搜索功能
- ActionBar上添加搜索功能
- 20.ViewFilpper+手势实现ViewPager功能+添加动画
- iOS tableview 实现简单的搜索功能
- 利用RecyclerView的嵌套实现仿京东筛选框(文字搜索功能)
- ios UISearchDisplayController 实现 UITableView 搜索功能
- TextView添加链接实现富文本label带点击功能
- ios UISearchDisplayController 实现 UITableView 搜索功能 UISearchDisplayController 是苹果专为 UITableView 搜索封装
- iOS tableview实现简单搜索功能
- IOS 实现多种分类 添加删除排序功能(LXReorderableCollectionViewFlowLayout)
- SearchView+RecyclerView+GreenDao的搜索功能实现(2)
- iOS中tableView上实现搜索功能
- XRecyclerView:实现下拉刷新、滚动到底部加载更多以及添加header功能的RecyclerView
- 利用videoView创建播放器,实现展示视频列表和搜索sd卡功能 以及android6.0的动态授权等功能
- ActionBar简单使用——添加搜索按钮;让不同的Activity上显示不同的ActionBar;添加Tab标签;实现DrawerLayout并用ActionBarDrawerToggle控制
- jQuery实现添加“成绩单” 搜索功能和清除功能
- ActionBar上添加搜索和分享功能
- 使用AutoCompleteTextView和SharePreference实现搜索历史自动提示功能