getFilter()可以搜索过滤的数据,不能显示原始数据

时间:2019-01-10 11:59:39

标签: java android

我的过滤器可以正常工作,但在清空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:

关闭案例。

1 个答案:

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