首页 > 解决方案 > 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:

结案。

标签: javaandroid

解决方案


您必须制作两个列表,一个包含过滤数据,另一个包含原始数据。

并像这样使用它(这是一个接触过滤器的演示)

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


推荐阅读