GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索
之前写过一个静态的搜索页
FlowLayout流式布局实现标签、类似热门搜索这种效果
只是能实现界面效果,但是往往开发中是要把搜索历史缓存到本地数据库中,所以在原基础上添加了数据库功能。
并且把搜索框换成了SearchView,热门搜索标签还用洪洋大神的FlowLayout,请看布局
页面总共分为五部分,分别是搜索框,搜索按钮,热门搜索,搜索历史,和清空。
对于整个页面来说,热门搜索是比较简单的一部分,根据后台返回的数组或者集合,直接放上去就行。
重点在与搜索历史
其中要实现的功能
1、加载页面的时候请求数据库,获取所有的搜索历史,List倒序排列
2、点击搜索的时候,将搜索的关键字添加进数据库,刷新UI
3、清空搜索历史,清空数据库,刷新UI
4、搜索历史数量限制在一定范围,并且保证关键字不重复
5、实现标签的监听
关于
由于第一次使用GreenDao,中间遇到了一些问题,挖了一些坑。不过都解决了,其中要感谢简书上的两位作者给我的帮助@作者黄海佳、@作者 tonycheng93
关于界面所用到的库:
//FlowLayout
compile 'com.zhy:flowlayout-lib:1.0.3'
compile 'org.greenrobot:greendao:3.2.0'
关于GreenDao的优点:不需要写sql语句,处理速度比sqlLite快两倍以上,在Android中用的很多的一个ORM框架。
如果还没有学习过的可以在简书搜相关教程文章有很多。
在引入GreenDao的时候如果遇到一直下载不下来,去改代理方式,就能解决。
FlowLayout是洪洋封装的一个开源布局框架,支持单选、多选等,适合用于产品标签等。对于像热门搜索,搜索历史,标签等这种布局的开发,是最合适不过的了。
一、初始化数据
在Make Modle的时候,会生成一个操作数据库的类,以Dao为结尾,我这里创建的modle是User,所以生成了一个UserDao类。
在进入界面的时候需要我们进行初始化数据库的方法
/*初始化数据库相关*/private void initDbHelp() {DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "recluse-db", null);SQLiteDatabase db = helper.getWritableDatabase();DaoMaster daoMaster = new DaoMaster(db);DaoSession daoSession = daoMaster.newSession();userDao = daoSession.getUserDao();}
然后是获取数据
这里的获取数据是利用userDao查询数据库里所有存在的数据,当存在的时候,把清空历史搜索的按钮设置显示,无数据的布局设置为none。
由于结果默认升序排列,这里要使用Collections.reverse方法将其转为倒序,也就是最后搜索的关键词置顶。
这里把初始化的方法单独使用了一个类,方便后面其他操作也能调用。
/*** 初始化adapter,更新list,重新加载列表*/private void updateList() {//查询所有list = userDao.queryBuilder().list();//这里用于判断是否有数据if (list.size()==0){searchGreendaoRl.setVisibility(View.VISIBLE);searchGreendaoDelete.setVisibility(View.GONE);}else {searchGreendaoRl.setVisibility(View.GONE);searchGreendaoDelete.setVisibility(View.VISIBLE);}//list倒序排列Collections.reverse(list);adapter = new SearchViewGreenDaoAdapter(mContext, list);searchGreendaoLv.setAdapter(adapter);adapter.notifyDataSetChanged();}
二、搜索功能实现
搜索功能包括两个操作,一是跳转到搜索结果页,二是保存历史记录到本地数据库。
保存数据库,用到插入的方法,当输入一条关键字,在键盘点击回车搜索,或者在界面上点击搜索按钮,其执行的方法都是一样的。都是获取输入框文字,然后再保存。
SearchView中不再使用gittext来获取输入框的文字,要想获取文字,要实现其监听方法
//搜索文本监听searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Override//点击搜索public boolean onQueryTextSubmit(String query) {name = query;Log.e("name--------", name + "");insertDB();return false;}@Override//当搜索内容改变public boolean onQueryTextChange(String newText) {name = newText;Log.e("newText---------", newText);if (name.equals("")) {searchGreendaoLv.setFilterText(name);} else {
// insertDB();searchGreendaoLv.clearTextFilter();}return false;}});
正常的获取文字只需要在onQueryTextSubmit方法把query的值返回,就能获取到输入的文字。
onQueryTextChange是用来动态获取输入的文字,常用在联想词等。
获取到我们的搜索关键字之后,
直接使用
userDao.insert(new User(null, name));
就可以添加到数据库,但是在这里为了开发需要,我做了以下限制。
1、保证历史记录一直只有8条记录
2、对于重复的历史记录,只保存最近的一条,如果有重复的,删除之前的。
3、当记录超过8条时,自动删除最下面的数据,实现循环。
//增private void insertDB() {try {if (list.size() < 8) {//删除已经存在重复的搜索历史List<User> list2 = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().list();userDao.deleteInTx(list2);//添加userDao.insert(new User(null, name));Toast.makeText(mContext, "插入数据成功:" + name, Toast.LENGTH_SHORT).show();} else {//删除第一条数据,用于替换最后一条搜索userDao.delete(userDao.queryBuilder().list().get(0));//删除已经存在重复的搜索历史List<User> list3 = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().list();userDao.deleteInTx(list3);//添加userDao.insert(new User(null, name));}updateList();} catch (Exception e) {Toast.makeText(mContext, "插入失败", Toast.LENGTH_SHORT).show();}}
在添加完成之后,使用之前定义的初始化方法刷新UI.
三、清空数据库
这一步是比较简单的,直接调用deleteAll就能删除所有的数据,然后顺便清空list,刷新Adapter,布局改变。
//清空数据库private void delectAllDB() {try {userDao.deleteAll();list.clear();adapter.notifyDataSetChanged();searchGreendaoRl.setVisibility(View.VISIBLE);searchGreendaoDelete.setVisibility(View.GONE);Toast.makeText(mContext, "清空数据库", Toast.LENGTH_SHORT).show();} catch (Exception e) {Log.e("exception-----delete", user + "message:" + e.getMessage() + "");}}
四、热门标签流式布局效果
在引入FlowLoyout后,Activity里可以自己定义一个数组
private String[] mVals = new String[]{"Hello", "Android", "Weclome Hi ", "Button", "TextView", "Hello","Android", "Weclome", "Button ImageView", "TextView", "Helloworld"};
或者从后台获取json都可以,
然后在setAdapter中把数据传入。
searchGreendaoFlowlayout.setAdapter(new TagAdapter<String>(names) {@Overridepublic View getView(FlowLayout parent, int position, final String s) {final TextView tv = (TextView) LayoutInflater.from(mContext).inflate(R.layout.search_page_flowlayout_tv, searchGreendaoFlowlayout, false);tv.setText(s);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "" + s, Toast.LENGTH_SHORT).show();}});return tv;}});
顺便把热门标签的监听也写上了。
如果是要对历史搜索的列表监听,直接在Adapter中调用onclickListener就可以了。
其实关于搜索,并没有太难的地方,主要是考察对数据库的一些基本操作,把刚学习的GreenDao应用到项目中来。
还有很多地方还需要进一步优化。
本来想再加个联想词的功能,但是在一个只有8条记录的历史上使用,有点不适合。
联想词多用于大量的数据列表的时候,方便用户进行筛选。
从产品角度来说是不合理的,我们在开发的同时也不得不考虑功能的合理性。
项目源码在GitHub
如果你觉得还不错,欢迎Star,将感之不尽!
相关阅读资料
Android ORM框架学习-greenDAO的基本使用
GreenDAO 3.x项目开发实战持续更新ing — Android ORM框架(三)
SearchView+RecyclerView+GreenDao的搜索功能实现(2)
GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索相关推荐
- 微信小程序搜索,搜索历史,清除搜索历史,以及点击搜索历史实现搜索功能
微信小程序搜索,搜索历史,清除搜索历史,以及点击搜索历史实现搜索功能 热搜内容一般从接口遍历的,实现方法基本和搜索历史差不多 wxml页面 <view class="search-he ...
- Vue音乐--搜索页面03_热门搜索组件
大概步骤: 目标效果 三.新建热门搜索关键词组件的数据获取和布局 要点: QQ音乐移动端网页抓取热门搜索的关键词数据 截取关键词数据数组的前10个 对数据列表布局为圆角边框样式 点击热门搜索关键词,关 ...
- win10搜索框的热门搜索怎么关闭?
搜索cmd,以管理员模式运行,输入下列命令,重启生效 reg add HKCU\Software\Policies\Microsoft\Windows\explorer /v DisableSearc ...
- java 热门搜索 实现_热门搜索词获取java版
日常生活中经常会有这样的需求,就是网站上.app上需要展示近期热搜的一些词汇,其实常用的做法当然是自己写爬虫去爬,不过这种办法是在太麻烦了,为了节省时间,可以调用一些接口来实现,比如常用的聚合数据,小 ...
- Android保存搜索历史
在我项目中,有这样一个功能实现:先看图 搜索后实时将搜索内容显示到RecyclerView中,可以删除单个历史,也可以清空全部,点击其中一项显示到EditText中.将会涉及到的内容有: Recycl ...
- Win11的两个实用技巧系列之如何关闭文字热门搜索、任务栏上的应用
目录 in10和Win11 22H2如何关闭文字热门搜索? Win11 22H2关闭文字热门搜索 Win10 22H2关闭文字热门搜索 Win11中如何不用鼠标打开已固定在任务栏上的应用 鼠标的操作方 ...
- vue 实现搜索历史_微信小程序实现搜索历史功能
结合了微信给的资料,马马虎虎摸索出了一些东西,下面说一下微信小程里序搜索历史功能的实现,下图是实现效果. 首先,定义历史记录的显示风格和方式,在下用的是列表模式,没有使用什么比较酷炫的套路. {{it ...
- Android浏览历史sqlite功能,[Android]greendao实现搜索历史功能
使用greendao实现搜索历史功能 ezgif-1-378e749b52.gif device-2017-08-31-103330.png 之前封装sqlite实现过这功能,不过原生封装使用sql语 ...
- 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)
GitHub Demo 地址: jh-weapp-demo 实现一些常用效果.封装通用组件和工具类 小程序码 效果图: wxml 代码: <van-search value="{{ i ...
最新文章
- 从线上偶发的宕机事件看Netty流量控制
- 如何查询中文期刊等级分类表_必备 | 如何查找期刊是否为核心刊物、SCI、SSCI、CSSCI、ISTP?...
- 正点原子stm32f429 pcb_正点原子【STM32-F407探索者】第十六章 电容触摸按键实验
- AngularJS:在Windows上安装Yeoman
- 直播预告 | 后广告时代数据助力融合媒体用户收入增长
- python常用算法包_Python中常用的包--sklearn
- 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
- java 导出表 sql_java中把SQL数据库中的表导出到excel中.怎么实现
- 又真香了!到底是怎样的软件测试面试文档,拿到这么多大厂offer
- 457.环形数组循环
- 【观察】 全新紫光云:“云数智”底盘再升级,背后的三重新价值
- 利用mlxtend进行数据关联分析
- 关于《网上购书系统》
- Revit二次开发--为管道添加标注
- 微信小程序-视频弹幕的项目
- 漫画程序猿惯用口头禅
- 直播带货系统,实现一套完整的直播系统应该具备的功能
- hive 以beeline的模式启动
- Conflux v2.2.0 网络 Hardfork 升级公告
- Oracle11g卸载完服务还有,Oracle11g服务器与客户端卸载、安装
热门文章
- laydate实现日期多选
- Visualizing and Understanding Convolutional Networks
- 2022年12月电子学会青少年软件编程Scratch(四级)等级考试真题解析
- ajax使用post提交时却报错为 Request GETUnsupport
- Dell R730 通过PXE 安装 Debian x64
- TruNet: Short Videos Generation from Long Videos via Story-Preserving Truncation(论文翻译)
- 超声波脉冲电路线路板设计
- C#5.0 In A NutShell翻译勘误
- mac系统下excel打开csv中文乱码
- 动态规划算法帮我通关了“魔塔”