如何对 SimpleCursorAdapter 支持的 Android ListView 进行文本过滤?

Posted

技术标签:

【中文标题】如何对 SimpleCursorAdapter 支持的 Android ListView 进行文本过滤?【英文标题】:How to text filter an Android ListView backed by a SimpleCursorAdapter? 【发布时间】:2011-01-01 10:28:24 【问题描述】:

我有一个由 SimpleCursorAdapter 支持的 ListView。

我希望能够像过滤联系人列表一样过滤列表,只需键入,我遇到了 textFilterEnabled()

问题是,我不知道如何让它与 SimpleCursorAdapter 一起工作。

这可能吗? 如果是这样,它是如何完成的?

【问题讨论】:

【参考方案1】:

对于 SimpleCursorAdapter 游标,您只需要使用 setFilterQueryProvider,根据约束为您的游标运行另一个查询:

m_Adapter.setFilterQueryProvider(new FilterQueryProvider() 

  public Cursor runQuery(CharSequence constraint) 
    Log.d(LOG_TAG, "runQuery constraint:"+constraint);
    //uri, projection, and sortOrder might be the same as previous
    //but you might want a new selection, based on your filter content (constraint)
    Cursor cur = managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    return cur; //now your adapter will have the new filtered content
  

);

当添加约束时(例如,通过使用 TextView),必须过滤适配器:

public void onTextChanged(CharSequence s, int start, int before, int count) 
  Log.d(LOG_TAG, "Filter:"+s);
  if (m_slvAdapter!=null) 
    m_Adapter.getFilter().filter(s);
  

希望这会有所帮助。过几天我会尽量写一篇完整的文章,附上源码。

【讨论】:

好答案,是少数显示带有光标的 runQuery 部分的答案之一 - 如果您包含选择示例,那就更好了。例如。 selection = FIELD_NAME_TO_FILTER + "like '" + constraint.toString() + "'"; 如果我们使用 SQLite 数据库,我们应该如何在 runQuery 中调用游标?使用与用于为 SimpleCursorAdapter 创建游标的实例相同的 databaseHelper 实例给我一个“fillWindow() 中的无效语句”错误。 m_slvAdapter 是否代表m_Adapter【参考方案2】:

setTextFilterEnabled() 方法不会自动实现过滤,因为它不知道您的Cursor 中的什么文本应该被过滤。

这个android-developers thread有更多细节。

其实前几天问了一个很好的问题,其实和你的问题很相似;虽然它最初是询问当设备上没有物理键盘时如何处理过滤:

How to dynamically update a ListView on Android

【讨论】:

【参考方案3】:

我发现这篇文章很有帮助http://androidcookbook.oreilly.com/Recipe.seam;jsessionid=CE37400B3E545937B70BE2E9F94E78BB?recipeId=404

基本上,您在列表视图上使用setTextFilterEnabled(true),在您的SimpleCursorAdapter 上使用setStringConversionColumn()setFilterQueryProvider()

【讨论】:

以上是关于如何对 SimpleCursorAdapter 支持的 Android ListView 进行文本过滤?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何更改列表视图中列表项的背景颜色,由 SimpleCursorAdapter 管理

子类化 SimpleCursorAdapter 以包含 convertView 以节省内存

SimpleCursorAdapter无法在MainActivity中使用

使用 SimpleCursorAdapter 从 Cursor 更改值

SimpleCursorAdapter使用代码

带有 SimpleCursorAdapter 的 AutoCompleteTextView 用于加载联系人