[译]应用内搜索功能实现 Android TV应用程序手册教程十三
版权声明:本文为博主原创翻译文章,转载请注明出处。
推荐: 欢迎关注我创建的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应用程序手册教程十三相关推荐
- 使用 Swiftype 给 Hexo 搭建的博客添加站内搜索功能
当我们的 博客 文章变的越来越多的时候,就非常需要使用 站内搜索 功能,否则寻找某一篇文章就会变的麻烦,Swiftype 是一个非常好的站内搜索平台,并且是 免费 的,可以到 我的博客 去预览一下搜索 ...
- 如何加强站内搜索功能
简书站内搜索功能太简陋,还有很大提升空间: 搜索指定作者 有时候自己写的文章太多,某篇文章有印象写过,但却找不到,这时候可以通过指定作者搜索功能全文查找自己的文章 搜索24小时热搜关键词 image. ...
- PHP站内搜索功能(laravel自带Scout驱动+elasticsearch)
站内搜索 由于最近做的网站需要用到网站的站内搜索,我也是偷偷摸摸学了一手,希望有需要的朋友也可以看看 搜索引擎 Elasticsearch 官方网站 https://www.elastic.co/cn ...
- 谷歌 Google Custom Search 站内搜索功能
谷歌 Google Custom Search 站内搜索功能 一. 进入设置网址 https://cse.google.com 二. 登入谷歌账号,没有的需申请 三. 新增搜索引擎,添加网址 点击创建 ...
- 百度站内搜索代码php,网页嵌入百度搜索条(含站内搜索功能)
网页嵌入百度搜索条(含站内搜索功能) 样式一: 代码: function g(formname) { var url = "http://www.baidu.com/baidu"; ...
- Kesion CMS 站内搜索功能
虽然将KesionCMS站内搜索功能成功移植到了自己站点里,但对于它的实现原理.代码.标签并不太懂,所以这次移植成功花了很多时间和精力修改代码,记录下来方便以后使用. 一.每个页面都有的通用搜索框(从 ...
- html织梦站内搜索代码,简单三步-实现dede站内搜索功能
前几天,在帮一个客户在做网站时,因为客户要求网站内要弄一个产品搜索功能.因为才接触dede不久,对于dede也不是很熟悉.在网上查询了一些资料,但觉得网上的资料很杂乱,把一个简单的东西变为复杂化了.下 ...
- [译]MediaSession MediaController – Android TV 应用开发教程九
版权声明:本文为博主原创翻译文章,转载请注明出处. 推荐: 欢迎关注我创建的Android TV 简书专题,会定期给大家分享一些AndroidTv相关的内容: www.jianshu.com/c/37 ...
- 简单三步-实现dede站内搜索功能
第一步:找到对应的搜索模板的代码 我们都知道,dede有自带的搜索功能,我们只要找到对应的模板,然后把我们想要的代码拿出来就行了.具体如下: 首先进入templets-->default--&g ...
- android设计轮播功能按钮,Android TV HorizontalScrollView 图片轮播 遥控器上下按键的处理...
当前位置:我的异常网» Android » Android TV HorizontalScrollView 图片轮播 遥控器 Android TV HorizontalScrollView 图片轮播 ...
最新文章
- 【WEB API项目实战干货系列】- API登录与身份验证(三)
- Vim 快捷键整理【转】
- Fibonacci数列时间复杂度之美妙
- 秒懂servletContext对象
- 最全面的 python 字符串拼接总结(带注释版)
- npcap loopback adapter是什么意思_抖音限流是什么意思? 抖音为什么突然限流?
- 第四章 虚拟机的安装和使用
- apache2 wordpress目录权限_小白指南:WordPress中的用户角色和权限
- Android Studio 修改项目包名(最后一级)
- 最大子矩阵问题----悬线法
- apple tv 开发_如何将蓝牙耳机连接到Apple TV
- 只用一个div画一个小米logo
- c语言编程文曲星猜数字,文曲星里的猜数字代码(原创)
- Jenkins 登录忘记用户名和密码
- python bind函数_python bind是什么意思
- Android Studio2.2 CMAKE高效NDK开发
- 通过命令行5步声成sisx文件(Symbian)
- Unity3D开发网络游戏《丛林战争》流程日记
- 58同城姚劲波:以域名起家 从创业小子到亿万富翁
- C#中Abstract和Virtual使用详解