Android 使用自定义布局搜索中的自定义建议

Android 使用自定义布局搜索中的自定义建议,android,search-suggestion,Android,Search Suggestion,使用搜索对话框时,我已成功实现自定义搜索建议。然而,目前每个建议项目只是文本。我想在左边添加一个图标。但问题是,我没有这些图片在本地,而是可以通过URL访问它们。我在文档()中找不到如何将URL而不是Uri发送到建议栏图标1下的本地文件。我发现这是不可能的,只要你想使用默认的Android搜索功能。如果您不知道,请发表评论。我发现这是不可能的,只要您想使用默认的Android搜索功能。如果你不知道,请发表评论。所以这是可能的,但这是一个相当糟糕和有点骇客。您必须创建一个ContentProvid

使用搜索对话框时,我已成功实现自定义搜索建议。然而,目前每个建议项目只是文本。我想在左边添加一个图标。但问题是,我没有这些图片在本地,而是可以通过URL访问它们。我在文档()中找不到如何将URL而不是Uri发送到建议栏图标1下的本地文件。

我发现这是不可能的,只要你想使用默认的Android搜索功能。如果您不知道,请发表评论。

我发现这是不可能的,只要您想使用默认的Android搜索功能。如果你不知道,请发表评论。

所以这是可能的,但这是一个相当糟糕和有点骇客。您必须创建一个ContentProvider来提供应用程序内部缓存目录中的图像(请参见此处的答案)

然后,由于您的文件内容提供者将在主UI线程上访问,因此您无法在那里下载图像。您必须下载搜索提供者的query()函数中的所有图像。如果您将它们放在应用程序的内部缓存目录中,文件内容提供商可以在SearchView请求时返回它们

比如:

class ImagesProvider extends ContentProvider {
...
// stuff from https://stackoverflow.com/a/15667914/473201
...
}
然后在搜索内容提供者中:

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

   // create a cursor table of results
   MatrixCursor mc = new MatrixCursor(columns);
   for (SearchResult res : results) {

      String filename = res.getId();
      ImagesProvider.downloadAndSaveFile(filename, res.getPictureUrl());

      mc.addRow(new Object[] {
        res.getId(),
        res.getName(),
        ContentUris.withAppendedId(ImagesProvider.CONTENT_URI, filename)
      });
   }
   return mc;
}

所以这是可能的,但这是一个相当混乱和有点骇客。您必须创建一个ContentProvider来提供应用程序内部缓存目录中的图像(请参见此处的答案)

然后,由于您的文件内容提供者将在主UI线程上访问,因此您无法在那里下载图像。您必须下载搜索提供者的query()函数中的所有图像。如果您将它们放在应用程序的内部缓存目录中,文件内容提供商可以在SearchView请求时返回它们

比如:

class ImagesProvider extends ContentProvider {
...
// stuff from https://stackoverflow.com/a/15667914/473201
...
}
然后在搜索内容提供者中:

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

   // create a cursor table of results
   MatrixCursor mc = new MatrixCursor(columns);
   for (SearchResult res : results) {

      String filename = res.getId();
      ImagesProvider.downloadAndSaveFile(filename, res.getPictureUrl());

      mc.addRow(new Object[] {
        res.getId(),
        res.getName(),
        ContentUris.withAppendedId(ImagesProvider.CONTENT_URI, filename)
      });
   }
   return mc;
}

我知道这是一个老问题,但是关于这个话题的帖子似乎很少


我花了大量时间(约5小时)尝试让搜索使用自定义布局(希望结果是全屏的,并按类别进行分割,这是一个相当自定义的布局)并使用主题中描述的方法,但是我的SearchActivity(及其定义的自定义布局)当Android系统直接调用我的内容提供商的查询方法并在一个难看的下拉列表中显示结果时,使用SearchWidget时从未创建过。最后我开始了我自己的自定义搜索,花了大约1个小时,所以简单的回答是,开始你自己的搜索。

我知道这是一个老问题,但关于这个主题的StackOverflow帖子似乎很少


我花了大量时间(约5小时)尝试让搜索使用自定义布局(希望结果是全屏的,并按类别进行分割,这是一个相当自定义的布局)并使用主题中描述的方法,但是我的SearchActivity(及其定义的自定义布局)当Android系统直接调用我的内容提供商的查询方法并在一个难看的下拉列表中显示结果时,使用SearchWidget时从未创建过。我最终启动了自己的自定义搜索,花了约1个小时,所以简短的回答是,启动自己的搜索。

感谢您的精彩回答!我可以正常工作,只是我返回了尚未下载的图像的占位符,然后在后台下载它们。这些建议不会被阻止,这很好,但我还没有找到一种方法在图像下载后更新它们。有什么想法吗?我尝试了
ContentResolver.notifyChange()
,但Android的
SuggestionAdapter
似乎没有注册更改,因此它没有注意到。谢谢你的回答!我可以正常工作,只是我返回了尚未下载的图像的占位符,然后在后台下载它们。这些建议不会被阻止,这很好,但我还没有找到一种方法在图像下载后更新它们。有什么想法吗?我尝试了
ContentResolver.notifyChange()
,但Android的
SuggestionAdapter
似乎没有注册更改,所以它没有注意到。