我在操作栏中有一个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的调用下拉!
答案 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