java - 允许对 Android SearchView 进行数字和文本过滤
问题描述
如何允许用户使用文本和数字过滤他们的联系人列表?这样用户就可以根据他们的姓名和电话号码来搜索联系人。
为了清楚起见,在我当前的代码下方:
@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
menu.clear(); // clears all menu items..
inflater.inflate(R.menu.options_menu_contacts, menu);
final MenuItem searchMenuItem = menu.findItem(R.id.search); // search option
SearchView mSearchView = (SearchView) searchMenuItem.getActionView();
// Set the filtering listener
mSearchView.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
// TODO - hide the user card onSearch
// Needed to close the SearchView when pressing back (instead of just losing focus)
mSearchView.setOnQueryTextFocusChangeListener(
(v, hasFocus) -> {
// TODO - on focus change, show/hide user's card
if (!hasFocus) {
adapter.isSearchMode = false;
searchMenuItem.collapseActionView();
adapter.notifyDataSetChanged();
} else {
adapter.isSearchMode = true;
searchMenuItem.collapseActionView();
adapter.notifyDataSetChanged();
}
});
super.onCreateOptionsMenu(menu, inflater);
}
解决方案
您可以同时查询号码和联系人姓名。
在您的适配器中:
public class Adapter extends RecyclerView.Adapter<Viewholder> implements Filterable {
private ArrayList<Contacts> contactArrayList = new ArrayList<>();
private ArrayList<Contacts> mFilteredList = new ArrayList<>();
private Context context;
...
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = contactArrayList;
} else {
ArrayList<Contacts> filteredList = new ArrayList<>();
for (Contacts contact : contactArrayList) {
if (contact.getNumber().toLowerCase().contains(charString.toLowerCase()) || events.getName().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(contact);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (ArrayList<Contacts>) filterResults.values;
notifyDataSetChanged();
}
};
}
}
推荐阅读
- javascript - 根据交替的相关下拉列表更改 Ajax Post 参数和返回的 HTML
- mocha.js - 从 Mocha 测试的报告输出中删除已执行的 SQL 查询
- sql - SQL 将 2 行合并为 1 行,然后删除 1
- html - 嵌入在网页中的 Google 表格
- c++ - 如果我到达文件c ++的末尾,我如何关闭文件
- python - 为什么水平线仅部分显示在 sage / matplotlib 中?
- html - 对于我的登录页面,我有一张图片作为其背景。但是一旦你登录它就会转移到游戏中并阻止它
- javascript - 如何在 NGINX 上重定向并将原始请求存储为 POST 变量?
- c# - Websocket 代码在控制台中有效,但在 winform 中无效
- regex - 每千位数