【问题标题】:SearchManager - adding custom suggestionsSearchManager - 添加自定义建议
【发布时间】:2012-01-29 07:10:30
【问题描述】:

我已经阅读了有关构建搜索界面和添加自定义建议的所有在线文档......但我仍然不清楚这是如何工作的。文档说我必须“为您的建议构建一个表(例如在 SQLiteDatabase 中)并使用所需列格式化表”。我假设系统最终会自行使用适当的建议填充此表......但是哪个进程/类对此负责,以及实际插入何时发生(在用户进行任何查询之前,在用户等查询过)?

当我在这里问一个问题时,如果有人可以澄清AutoCompleteTextView 和带有自定义建议的SearchView 之间的区别...那就太好了。与SearchView 相比,AutoCompleteTextView 似乎很容易实现(这需要对ContentProvider、SQLiteDatabase 辅助类等进行更改)。

【问题讨论】:

    标签: android android-contentprovider autocompletetextview


    【解决方案1】:

    您必须创建一个内容提供程序,该提供程序根据目前在搜索视图中输入的查询提供您的自定义建议。在您的 searchable.xml 中,您配置搜索表达式的最小长度,在请求建议之前必须达到该长度。这个内容提供者被称为建议提供者(它仍然扩展了 ContentProvider)。内容提供者的权限也在searchable.xml中配置。

    建议提供者计算其建议的方式没有限制。您可以搜索网络查询数据库或读取文件。但是查询的答案是表格的格式。如果直接从数据库查询建议,您可以使用由数据库查询回答的游标在内容提供者的 query() 方法中传递结果。如果结果是从一个或多个来源计算的,您可以使用 MatrixCursor 动态创建一个表。

    搜索机制使用来自建议提供者的答案行来显示建议,它们存储在表格中。行的格式如下:

    private static final String[] COLUMNS = {
        "_id",
        SearchManager.SUGGEST_COLUMN_ICON_1,        // ID of a drawable (icon) as String
        SearchManager.SUGGEST_COLUMN_TEXT_1,        // main text for suggestion display
        SearchManager.SUGGEST_COLUMN_TEXT_2,        // secondary text for suggestion display
        SearchManager.SUGGEST_COLUMN_INTENT_DATA,   // this could be an URI to access the suggestion as used in an intent with a VIEW action
        SearchManager.SUGGEST_COLUMN_INTENT_ACTION, // this could be Intent.ACTION_VIEW
        SearchManager.SUGGEST_COLUMN_SHORTCUT_ID    // e.g. SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT
    };
    

    这里更详细地描述了搜索:http://developer.android.com/guide/topics/search/index.html

    【讨论】:

    • 好吧...我想我开始明白了。但是建议何时/何处插入到表格中,建议有什么格式?这就是我感到困惑的地方。我会假设这种“自动完成”/建议功能将使用 Trie 或其他东西来实现......
    • 即建议表是什么样的?或者结果表不一定是人类可读的?这个表是什么时候创建的(是否需要使用execSQL创建)?
    • 我想在我的数据库中的某个列上获得一个简单的“自动完成/建议完成”搜索功能......但如果这意味着改变我的整个数据库并搞乱一堆文件,我总是可以在以后返回它(尽管我仍然相信这个东西不应该花那么长时间来实现!我想要的只是系统自动完成我数据库中的单列字符串!) .
    • 我更新了答案。到建议行(表)。表一词仅用于指代模式(列,请参阅答案)。它不是您正在使用或您必须管理的数据库中的表。你不需要改变你的数据库:你只需要编写一个建议提供者,它可以使用你的数据库来计算建议。但结果必须转换为给定的列。请注意,搜索和自动完成的工作方式可能不同(我还没有使用过自动完成,所以我没有费心研究它是如何工作的)。
    • 太棒了,我想我明白了。让我确保我不会再误会一次。 (1) 您在搜索栏中输入内容。 (2) SearchManager 看到这一点并使用适当的SearchManager.SUGGEST_URI_PATH_QUERY uri 查询您的 ContentProvider。 (3​​) 默认情况下,查询文本将附加到此 uri。然后,您将在数据库中查询给定的查询文本,并在建议上返回一个 Cursor。
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多