主要功能:在已获取的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();
}
};
}
}
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方法略
}