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()回调中执行查询。

最新更新