Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 数据更改时,AutoSearchTextView下拉列表闪烁_Android_Android Spinner_Android Filter - Fatal编程技术网

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

Android 数据更改时,AutoSearchTextView下拉列表闪烁,android,android-spinner,android-filter,Android,Android Spinner,Android Filter,我在actionbar中有一个AutoSearchTextView。当我过滤数据时,下拉列表隐藏起来,然后很快显示出来。我真的更喜欢播放商店的效果,在那里你过滤结果,下拉列表总是可见的,但是下拉列表中的内容会改变 这是适配器中的筛选代码,运行历史记录查询,获取历史记录并设置列表项 @Override public Filter getFilter() { if (filter == null) { filter = new Filter() { @

我在actionbar中有一个AutoSearchTextView。当我过滤数据时,下拉列表隐藏起来,然后很快显示出来。我真的更喜欢播放商店的效果,在那里你过滤结果,下拉列表总是可见的,但是下拉列表中的内容会改变

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

@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上的Disclose下拉列表

好吧,结果证明答案很简单,有时候最好的方法就是检查源代码:)

AutoSearchTextView有一个方法
public void onFilterComplete(int count)
,该方法依次调用
private void updateDropDownForFilter(int count)
,如果计数为零,下拉列表将被隐藏

必须对从筛选器返回的FilterResults对象设置计数
受保护的FilterResults PerformFilter(CharSequence约束)
方法

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

解决了这个问题

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

最简单的方法是将过滤器查询Provider与例如SimpleCorsOrAdapter一起使用,或者在扩展光标Adapter时,只需覆盖runQueryOnBackgroundThread(),使用它可以避免像现在这样的错误

编辑:


在您的情况下,如果您不需要自定义适配器,请使用带有自定义FilterQueryProvider覆盖runQuery()的SimpleCorsorAdapter,您可以返回所需的所有数据(请参阅我在这里的答案“如何查询wikipedia:),如果真的需要自定义适配器扩展游标适配器并在runQueryOnBackgroundThread()中执行与在FilterQueryProvider中执行的操作完全相同的操作,此外,当您的数据来自多个源时,请使用一个合并游标,但只使用一个MatrixCursor

完全可以。如果要扩展过滤器,请使用正确的方法。不要设置
runHistoryQuery()
方法的结果(我很惊讶您没有遇到麻烦),而是让它返回新数据并将其分配给
FilterResults
对象(以及计数)。在
publishResults()
回调中,不要盲目调用
notifyDataSetChanged()
,分配新接收的数据(来自FilterResults参数),然后调用该方法。“不要盲目调用notifyDataSetChanged()”不确定您的意思,数据已更改,因此这是适当的位置。我同意数据应该在发布结果中设置-以前的做法有点奇怪。但是顺序仍然应该是set data,NOTIFYDATASETCHANGE SEQUALE?set data,调用
NOTIFYDATASETCHANGE()
。如果您在
performFiltering()
中更改数据,则是从后台线程更改数据,并且在进入
publishResults()
(在主UI线程上运行)调用
notifyDataSetChanged()之前,
ListView
可能会看到这些更改
。为什么不使用FilterQueryProvider?无需使用自定义适配器、过滤器等,@Luksprog Thank’s gotcha从其他地方复制代码,只需检查文档……这是为了提醒。但这并不能阻止闪烁(您好,正如您所看到的,我已经找到了一个解决方案。请显示代码,以演示您的答案如何解决问题。我的代码如何重新发明轮子一个过滤器不存在,以过滤数据,因为我需要您重新发明轮子,因为您正在扩展过滤器,处理FilterResults及其实现细节,如值、计数等您必须将自定义过滤器与自定义适配器集成,所有这些都已在CorsorAdapter中完成:您只需执行搜索查询,即itAutoSearchTextView适配器必须实现filterable,正如我所说的,我不需要游标适配器,这对不需要游标的数据类型没有意义。如果您有回复帖子代码显示了如何使用AutoSearchTextView,该视图执行两个请求—一个向web请求,一个向搜索历史记录内容提供程序请求,然后显示此内容。如果您不解释如何实现此目的,我无法给出正确答案。我认为这会产生更脆弱的代码,为什么我要将java对象转换为游标JUt为了使用游标适配器,感觉就像把一个圆钉子塞进一个方孔中。合并游标可能容易出现问题,尤其是在数据不完全相同的情况下。实际上,重写筛选器的代码量与重写runQueryonBackgroundThread的代码量完全相同。这似乎是您试图提出的一个学术观点这不是地方,你不能告诉我为什么我的代码是错误的,并回答最初的问题,代码是有效的,这似乎不是一个坏的做法