java - getFilter() 可以搜索过滤后的数据,不能显示原始数据
问题描述
我的过滤器工作正常,但在我清空我的 searchEditText 时不会恢复原始数据。
我得到的唯一错误是:
E / SpannableStringBuilder:SPAN_EXCLUSIVE_EXCLUSIVE 范围不能有零长度。
我之前做过研究,但大多数人说这是一个与键盘相关的错误,所以我在这里感到困惑,为什么我的过滤器在我清空 editText 时什么都不做,但是如果我在那里输入一些关键字就可以过滤它。
我不仅在亚行尝试过,还在我的设备上尝试过,但没有成功。
哦,我尝试将“char”作为 null 发送,但你猜对了,它返回一个错误:
在空对象引用上
更新 1:
根据 ADM,我已将代码更改为
更新 2: 我已仔细遵循 Alokit Nigam 的建议,回答并将我的代码更改为如下内容:
searchView = findViewById(R.id.searchEt);
searchView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
和我的过滤器
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String charString = constraint.toString();
List<product> productsfiltered;
Log.i("--->", "performFiltering: "+ charString);
if (charString.isEmpty()){
productsfiltered = productList;
}
else {
List<product> filtered = new ArrayList<>();
for (product row : productList){
if (row.getnama().toLowerCase().contains(charString)){
filtered.add(row);
}
}
productsfiltered = filtered;
}
FilterResults filterResults = new FilterResults();
filterResults.values = productsfiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
productList = (ArrayList<product>) results.values;
notifyDataSetChanged();
}
};
}
这是日志
I/--->: performFiltering: k
I/--->: performFiltering: ke
I/--->: performFiltering: ked
I/--->: performFiltering: keda
I/--->: performFiltering: kedai
I/--->: performFiltering: keda
I/--->: performFiltering: ked
I/--->: performFiltering: ke
I/--->: performFiltering: k
E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
I/--->: performFiltering:
结案。
解决方案
您必须制作两个列表,一个包含过滤数据,另一个包含原始数据。
并像这样使用它(这是一个接触过滤器的演示)
ArrayList<ContactModel> contactModels;
ArrayList<ContactModel> contactModels1;
Context context;
SharedPreferences prefs;
DbHelper dbHelper;
public ContactsAdapter(Context context, ArrayList<ContactModel> contacts) {
this.context=context;
prefs = context.getSharedPreferences("login", MODE_PRIVATE);
contactModels=contacts;
contactModels1=contacts;
dbHelper=DbHelper.getInstance(context);
}
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
Log.i("--->", "performFiltering: "+charSequence);
List<ContactModel>contactListFiltered;
if (charString.isEmpty()) {
contactListFiltered = contactModels1;
} else {
List<ContactModel> filteredList = new ArrayList<>();
for (ContactModel row : contactModels1) {
if (row.getName().toLowerCase().contains(charString.toLowerCase()) ) {
filteredList.add(row);
}
}
contactListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = contactListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
contactModels = (ArrayList<ContactModel>) results.values;
// refresh the list with filtered data
notifyDataSetChanged();
}
};
}
还在 onTextChanged() 回调中执行查询。
推荐阅读
- javascript - 如何限制猫鼬集合中的文档数量?
- javascript - 如何在 C# 或 JavaScript 中将 DN 拆分并加入到来自 Active Directory 对象的路径
- python-3.x - 如何在 chrome os linux python 中知道我的目录路径
- maven - 解决maven工件的问题
- cloud-foundry - 使用 Pivotal Cloud Foundry 将用户重定向到另一个 URL
- mysql - 通过 aws rds mysql 在 hdfs 中导入大型 csv 的最快方法
- python - 自动化表单填写,其字段由 Google 和 Python 提供支持
- c# - 如何使用 LINQ 选择特定元素名称?
- html - 减少回流重绘并提高 css 性能
- python - 如何将循环的每次迭代期间更新的简单分数转换为正确的进度条?