版权声明:本文为博主原创翻译文章,转载请注明出处。

推荐: 欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容: www.jianshu.com/c/37efc6e97…


###搜索功能实现

在前一章中介绍了Leanback支持库和UI相关实现的SearchFragment的用法。 在本章中,我将介绍(背景)搜索功能逻辑。

本章的大部分实现仅仅是对googlesamples的解释 。 ###应用内搜索算法

搜索算法在loadRows方法中实现,特别是主逻辑在AsyncTask的doInBackground方法中。 其实很简单,只需检查字符串“ 查询 ”是否包含在电影项目的标题或描述中。

UI相关任务适配器处理在UI线程中完成。 onPreExecute通过clear方法初始化包含搜索结果的mRowsAdapter。 搜索本身在doInBackground中的后台线程中执行 ,它使包含搜索结果的新的ListRow 。 这个listRow是通过onPostExecute方法添加到UI线程中的Adapter 。

SearchFragment.java

    private void loadRows() {// offload processing from the UI threadnew AsyncTask<String, Void, ListRow>() {private final String query = mQuery;@Overrideprotected void onPreExecute() {mRowsAdapter.clear();}@Overrideprotected ListRow doInBackground(String... params) {final List<Movie> result = new ArrayList<>();for (Movie movie : mItems) {// Main logic of search is here. // Just check that "query" is contained in Title or Description or not.if (movie.getTitle().toLowerCase(Locale.ENGLISH).contains(query.toLowerCase(Locale.ENGLISH))|| movie.getDescription().toLowerCase(Locale.ENGLISH).contains(query.toLowerCase(Locale.ENGLISH))) {result.add(movie);}}ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());listRowAdapter.addAll(0, result);HeaderItem header = new HeaderItem("Search Results");return new ListRow(header, listRowAdapter);}@Overrideprotected void onPostExecute(ListRow listRow) {mRowsAdapter.add(listRow);}}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);}
复制代码

###执行搜索

由于上面已经实现了搜索算法,我们只需要调用这个函数来获得搜索结果。

SearchFragment.java

    @Overridepublic ObjectAdapter getResultsAdapter() {Log.d(TAG, "getResultsAdapter");// Delete previously implemented mock code.// mRowsAdapter (Search result) is already prepared in loadRows methodreturn mRowsAdapter;}...@Overridepublic boolean onQueryTextSubmit(String query) {Log.i(TAG, String.format("Search Query Text Submit %s", query));mQuery = query;loadRows();return true;}
复制代码

在onQueryTextSubmit方法中调用loadRows方法。 简单的实现已经完成了! 我们来尝试构建并运行代码。

搜索功能正常工作。

我们已经完成了搜索功能的最低执行。 下一步是即使在用户的文本输入过程中也能启用搜索。 ###动态搜索执行

为了检测用户输入搜索查询的时间,我们可以使用onQueryTextChange方法。 因此,基本概念是在onQueryTextChange中执行loadRows方法来实现动态(在用户输入期间)搜索。 但是,每当用户输入一个单词时,onQueryTextChange将被执行,并且在已经执行的时候不应该调用loadRows方法。 这里,Handler用于管理执行的loadRows方法。

SearchFragment.java

    private static final long SEARCH_DELAY_MS = 1000L;private final Handler mHandler = new Handler();private final Runnable mDelayedLoad = new Runnable() {@Overridepublic void run() {loadRows();}};.../*** Starts {@link #loadRows()} method after delay.* @param query the word to be searched* @param delay the time to wait until loadRows will be executed (milliseconds).*/private void loadQueryWithDelay(String query, long delay) {mHandler.removeCallbacks(mDelayedLoad);if (!TextUtils.isEmpty(query) && !query.equals("nil")) {mQuery = query;mHandler.postDelayed(mDelayedLoad, delay);}}
复制代码

loadQueryWithDelay方法使用Handler以稍微延迟的方式发布loadRows任务,以便loadRows任务不会太频繁地执行。 最后一个修改是从onQueryTextChange调用此loadQueryWithDelay方法。

SearchFragment.java

    @Overridepublic boolean onQueryTextChange(String newQuery){Log.i(TAG, String.format("Search Query Text Change %s", newQuery));loadQueryWithDelay(newQuery, SEARCH_DELAY_MS);return true;}@Overridepublic boolean onQueryTextSubmit(String query) {Log.i(TAG, String.format("Search Query Text Submit %s", query));// No need to delay(wait) loadQuery, since the query typing has completed.loadQueryWithDelay(query, 0);return true;}
复制代码

Build and run

可以看出,即使在用户输入搜索查询时,搜索仍然执行。 视频播放器

源代码在github上。

关注微信公众号,定期为你推荐移动开发相关文章。

转载于:https://juejin.im/post/5b714cb36fb9a0098729ad41

[译]应用内搜索功能实现 Android TV应用程序手册教程十三相关推荐

  1. 使用 Swiftype 给 Hexo 搭建的博客添加站内搜索功能

    当我们的 博客 文章变的越来越多的时候,就非常需要使用 站内搜索 功能,否则寻找某一篇文章就会变的麻烦,Swiftype 是一个非常好的站内搜索平台,并且是 免费 的,可以到 我的博客 去预览一下搜索 ...

  2. 如何加强站内搜索功能

    简书站内搜索功能太简陋,还有很大提升空间: 搜索指定作者 有时候自己写的文章太多,某篇文章有印象写过,但却找不到,这时候可以通过指定作者搜索功能全文查找自己的文章 搜索24小时热搜关键词 image. ...

  3. PHP站内搜索功能(laravel自带Scout驱动+elasticsearch)

    站内搜索 由于最近做的网站需要用到网站的站内搜索,我也是偷偷摸摸学了一手,希望有需要的朋友也可以看看 搜索引擎 Elasticsearch 官方网站 https://www.elastic.co/cn ...

  4. 谷歌 Google Custom Search 站内搜索功能

    谷歌 Google Custom Search 站内搜索功能 一. 进入设置网址 https://cse.google.com 二. 登入谷歌账号,没有的需申请 三. 新增搜索引擎,添加网址 点击创建 ...

  5. 百度站内搜索代码php,网页嵌入百度搜索条(含站内搜索功能)

    网页嵌入百度搜索条(含站内搜索功能) 样式一: 代码: function g(formname) { var url = "http://www.baidu.com/baidu"; ...

  6. Kesion CMS 站内搜索功能

    虽然将KesionCMS站内搜索功能成功移植到了自己站点里,但对于它的实现原理.代码.标签并不太懂,所以这次移植成功花了很多时间和精力修改代码,记录下来方便以后使用. 一.每个页面都有的通用搜索框(从 ...

  7. html织梦站内搜索代码,简单三步-实现dede站内搜索功能

    前几天,在帮一个客户在做网站时,因为客户要求网站内要弄一个产品搜索功能.因为才接触dede不久,对于dede也不是很熟悉.在网上查询了一些资料,但觉得网上的资料很杂乱,把一个简单的东西变为复杂化了.下 ...

  8. [译]MediaSession MediaController – Android TV 应用开发教程九

    版权声明:本文为博主原创翻译文章,转载请注明出处. 推荐: 欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容: www.jianshu.com/c/37 ...

  9. 简单三步-实现dede站内搜索功能

    第一步:找到对应的搜索模板的代码 我们都知道,dede有自带的搜索功能,我们只要找到对应的模板,然后把我们想要的代码拿出来就行了.具体如下: 首先进入templets-->default--&g ...

  10. android设计轮播功能按钮,Android TV HorizontalScrollView 图片轮播 遥控器上下按键的处理...

    当前位置:我的异常网» Android » Android TV HorizontalScrollView 图片轮播 遥控器 Android TV HorizontalScrollView 图片轮播 ...

最新文章

  1. 【WEB API项目实战干货系列】- API登录与身份验证(三)
  2. Vim 快捷键整理【转】
  3. Fibonacci数列时间复杂度之美妙
  4. 秒懂servletContext对象
  5. 最全面的 python 字符串拼接总结(带注释版)
  6. npcap loopback adapter是什么意思_抖音限流是什么意思? 抖音为什么突然限流?
  7. 第四章 虚拟机的安装和使用
  8. apache2 wordpress目录权限_小白指南:WordPress中的用户角色和权限
  9. Android Studio 修改项目包名(最后一级)
  10. 最大子矩阵问题----悬线法
  11. apple tv 开发_如何将蓝牙耳机连接到Apple TV
  12. 只用一个div画一个小米logo
  13. c语言编程文曲星猜数字,文曲星里的猜数字代码(原创)
  14. Jenkins 登录忘记用户名和密码
  15. python bind函数_python bind是什么意思
  16. Android Studio2.2 CMAKE高效NDK开发
  17. 通过命令行5步声成sisx文件(Symbian)
  18. Unity3D开发网络游戏《丛林战争》流程日记
  19. 58同城姚劲波:以域名起家 从创业小子到亿万富翁
  20. C#中Abstract和Virtual使用详解

热门文章

  1. Django(五):视图和路由系统
  2. 笔记本无线网卡变身热点供手机Wi-Fi免费通过宽带上网
  3. 【JOURNAL】《题虾壶》
  4. 自己动手写操作系统2011040101
  5. Windows Server 2003 SP2 中文版下载
  6. antd的Tree控件实现点击展开功能
  7. ios真机中Text组件出现多余边框
  8. 【blog】用emoji-java解决Emoji存储MySQL乱码问题
  9. SQL中的5种常用的聚集函数
  10. 【远程重启】使用windows自带的shutdown命令远程重启服务器(测试不行,此文作废)...