具有Arraylist中的1000个条目的AutocompleteTextView不起作用

时间:2018-12-26 16:09:24

标签: android performance large-data autocompletetextview

正在开发一个Android应用程序,该应用程序具有带有带有自定义适配器的autocompletetextview的表单,为此,我们有大约1k个条目的arraylist。但是使用1K数据无法正常工作。大约有400个条目,它正在工作,但过滤速度很慢。 如何处理这种大数据集?

以下是用于过滤的代码段:

     @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if (constraint != null) {
            suggestions.clear();

            for (ToMeet toMeet : tempItems) {
                if (toMeet.getNm().toLowerCase().contains(constraint.toString().toLowerCase()) ||
                        (toMeet.getAptNo() != null && toMeet.getAptNo().toLowerCase().toLowerCase().
                                contains(constraint.toString().toLowerCase()))) {

                    suggestions.add(toMeet);
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        if (results != null && results.count > 0) {
            ArrayList<ToMeet> filteredList = (ArrayList<ToMeet>) ((ArrayList<ToMeet>) results.values).clone();
            clear();
            for (ToMeet toMeet : filteredList) {
                add(toMeet);

            }
            notifyDataSetChanged();
        }
    }
};

1 个答案:

答案 0 :(得分:0)

在您的publishResults方法中,您为每个结果调用Adapter add方法。每次调用add方法时,都会通知列表已更改。

这可能会导致您看到缓慢的行为。

请改为使用Adapter addAll方法。除非您使用addAll

更改了默认行为,否则setNotifyOnChange应该为您调用数据集已更改的通知。
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    clear();
    if (results != null && results.count > 0) {
        addAll(results)
    }
}

您还可以优化performFiltering方法以使用trie数据结构,但我认为您不需要1000个项目。