数据更改时,AutoSearchTextView下拉列表会闪烁

时间:2014-06-03 09:26:53

标签: android android-spinner android-filter

我在操作栏中有一个AutoSearchTextView。当我过滤数据时,下拉隐藏,然后显示非常快。我真的更喜欢Play商店中的效果,您可以在其中过滤结果,下拉列表始终可见,但下拉列表中的内容会发生变化。

这是我的适配器中的过滤器代码,运行历史记录查询,获取历史记录并设置列表项。

@Override
public Filter getFilter() {
    if (filter == null) {
        filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                ResortFilterResult result = new ResortFilterResult();
                String substr = constraint.toString().toLowerCase();
                if (constraint != null) {
                    if (constraint.length() > 0) {
                        result.setHistory(runHistoryQuery(substr));
                    }
                    if (constraint.length() >= 3) {
                        LCResort[] resorts = searchResortWithQuery(substr);
                        result.setQueryResults(Arrays.asList(resorts));
                    }
                }
                FilterResults filterResults = new FilterResults();
                filterResults.values = result;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                ResortFilterResult result = (ResortFilterResult)results.values;
                history = result.getHistory();
                resorts = result.getQueryResults();
                notifyDataSetChanged();

            }
        };
    }
    return filter;
}

编辑:我更近了一步 - 事实证明,每当我输入一个新角色时,都会调用TextView的调用下拉!

2 个答案:

答案 0 :(得分:4)

好的,事实证明答案很简单,有时候只是检查源代码的最佳方式:)

AutoSearchTextView有一个方法public void onFilterComplete(int count),后者又调用 private void updateDropDownForFilter(int count),如果计数为零,则会隐藏下拉列表。

必须设置从过滤器protected FilterResults performFiltering(CharSequence constraint)方法返回的FilterResults对象的计数。

filterResults.count = result.getHistory().size() + result.getQueryResults().size();

解决了这个问题。

答案 1 :(得分:-2)

请不要重新发明轮子,使用现有的过滤器而不是创建自己的

最简单的方法是使用 FilterQueryProvider SimpleCursorAdapter 或者在扩展 CursorAdapter 时只需覆盖 runQueryOnBackgroundThread (),使用它可以避免像现在这样的错误

编辑:

如果您不需要自定义适配器使用 SimpleCursorAdapter 并使用自定义 FilterQueryProvider 覆盖 runQuery (),您可以返回所有数据如果真的需要自定义适配器扩展 CursorAdapter ,并在How to dynamically add suggestions to autocompletetextview with preserving character status)) > runQueryOnBackgroundThread ()您在 FilterQueryProvider runQuery ()中所做的工作,当您的数据来自多个来源时使用 MergeCursor 但完全可以使用一个 MatrixCursor