之前写过一个静态的搜索页
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实现搜索历史和热门搜索相关推荐

  1. 微信小程序搜索,搜索历史,清除搜索历史,以及点击搜索历史实现搜索功能

    微信小程序搜索,搜索历史,清除搜索历史,以及点击搜索历史实现搜索功能 热搜内容一般从接口遍历的,实现方法基本和搜索历史差不多 wxml页面 <view class="search-he ...

  2. Vue音乐--搜索页面03_热门搜索组件

    大概步骤: 目标效果 三.新建热门搜索关键词组件的数据获取和布局 要点: QQ音乐移动端网页抓取热门搜索的关键词数据 截取关键词数据数组的前10个 对数据列表布局为圆角边框样式 点击热门搜索关键词,关 ...

  3. win10搜索框的热门搜索怎么关闭?

    搜索cmd,以管理员模式运行,输入下列命令,重启生效 reg add HKCU\Software\Policies\Microsoft\Windows\explorer /v DisableSearc ...

  4. java 热门搜索 实现_热门搜索词获取java版

    日常生活中经常会有这样的需求,就是网站上.app上需要展示近期热搜的一些词汇,其实常用的做法当然是自己写爬虫去爬,不过这种办法是在太麻烦了,为了节省时间,可以调用一些接口来实现,比如常用的聚合数据,小 ...

  5. Android保存搜索历史

    在我项目中,有这样一个功能实现:先看图 搜索后实时将搜索内容显示到RecyclerView中,可以删除单个历史,也可以清空全部,点击其中一项显示到EditText中.将会涉及到的内容有: Recycl ...

  6. Win11的两个实用技巧系列之如何关闭文字热门搜索、任务栏上的应用

    目录 in10和Win11 22H2如何关闭文字热门搜索? Win11 22H2关闭文字热门搜索 Win10 22H2关闭文字热门搜索 Win11中如何不用鼠标打开已固定在任务栏上的应用 鼠标的操作方 ...

  7. vue 实现搜索历史_微信小程序实现搜索历史功能

    结合了微信给的资料,马马虎虎摸索出了一些东西,下面说一下微信小程里序搜索历史功能的实现,下图是实现效果. 首先,定义历史记录的显示风格和方式,在下用的是列表模式,没有使用什么比较酷炫的套路. {{it ...

  8. Android浏览历史sqlite功能,[Android]greendao实现搜索历史功能

    使用greendao实现搜索历史功能 ezgif-1-378e749b52.gif device-2017-08-31-103330.png 之前封装sqlite实现过这功能,不过原生封装使用sql语 ...

  9. 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)

    GitHub Demo 地址: jh-weapp-demo 实现一些常用效果.封装通用组件和工具类 小程序码 效果图: wxml 代码: <van-search value="{{ i ...

最新文章

  1. 从线上偶发的宕机事件看Netty流量控制
  2. 如何查询中文期刊等级分类表_必备 | 如何查找期刊是否为核心刊物、SCI、SSCI、CSSCI、ISTP?...
  3. 正点原子stm32f429 pcb_正点原子【STM32-F407探索者】第十六章 电容触摸按键实验
  4. AngularJS:在Windows上安装Yeoman
  5. 直播预告 | 后广告时代数据助力融合媒体用户收入增长
  6. python常用算法包_Python中常用的包--sklearn
  7. 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
  8. java 导出表 sql_java中把SQL数据库中的表导出到excel中.怎么实现
  9. 又真香了!到底是怎样的软件测试面试文档,拿到这么多大厂offer
  10. 457.环形数组循环
  11. 【观察】 全新紫光云:“云数智”底盘再升级,背后的三重新价值
  12. 利用mlxtend进行数据关联分析
  13. 关于《网上购书系统》
  14. Revit二次开发--为管道添加标注
  15. 微信小程序-视频弹幕的项目
  16. 漫画程序猿惯用口头禅
  17. 直播带货系统,实现一套完整的直播系统应该具备的功能
  18. hive 以beeline的模式启动
  19. Conflux v2.2.0 网络 Hardfork 升级公告
  20. Oracle11g卸载完服务还有,Oracle11g服务器与客户端卸载、安装

热门文章

  1. laydate实现日期多选
  2. Visualizing and Understanding Convolutional Networks
  3. 2022年12月电子学会青少年软件编程Scratch(四级)等级考试真题解析
  4. ajax使用post提交时却报错为 Request GETUnsupport
  5. Dell R730 通过PXE 安装 Debian x64
  6. TruNet: Short Videos Generation from Long Videos via Story-Preserving Truncation(论文翻译)
  7. 超声波脉冲电路线路板设计
  8. C#5.0 In A NutShell翻译勘误
  9. mac系统下excel打开csv中文乱码
  10. 动态规划算法帮我通关了“魔塔”