我的过滤器可以正常工作,但在清空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:
关闭案例。
答案 0 :(得分:0)
您必须制作两个列表,一个包含过滤数据,另一个包含原始数据。
并像这样使用它(这是联系人过滤器的演示)
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()回调中执行查询。