使用greendao实现搜索历史功能

ezgif-1-378e749b52.gif

device-2017-08-31-103330.png

之前封装sqlite实现过这功能,不过原生封装使用sql语句,而且greendao功能更强大(对不会sql的我来说更方便写),So...

PRE 依赖greendao

WARMING:

methodscount.com.png

greendao实体

@Entity

public class SearchHistory {

@Id(autoincrement = true) //自增主键

private Long id;

@Unique // 搜索记录(唯一)

private String name;

}

build gradle | make project(ctrl + F9),自动生成代码

public class MyApp extends Application {

private static MyApp instance;

private static DaoSession daoSession;

public static MyApp getInstance() {

return instance;

}

public static DaoSession getDaoInstant() {

return daoSession;

}

@Override

public void onCreate() {

super.onCreate();

instance = this;

setupDatabase("database.db");

}

/**

* 配置数据库

*/

private void setupDatabase(String name) {

//创建数据库

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, name, null);

//获取可写数据库

SQLiteDatabase db = helper.getWritableDatabase();

//获取数据库对象

DaoMaster daoMaster = new DaoMaster(db);

//获取Dao对象管理者

daoSession = daoMaster.newSession();

}

}

public class SearchHistoryDao {

/**

* 添加数据

*

* @param searchHistory

*/

public static void insertHistory(SearchHistory searchHistory) {

MyApp.getDaoInstant().getSearchHistoryDao().insertOrReplace(searchHistory);

}

/**

* 删除数据

*

* @param searchHistory

*/

public static void deleteHistory(SearchHistory searchHistory) {

MyApp.getDaoInstant().getSearchHistoryDao().delete(searchHistory);

}

/**

* 查询全部数据

*

* @return List

*/

public static List queryAll() {

return MyApp.getDaoInstant().getSearchHistoryDao().loadAll();

}

/**

* 清空数据

*/

public static void clearAll() {

MyApp.getDaoInstant().getSearchHistoryDao().deleteAll();

}

}

详细代码方便以后需要copy

xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#1E8AE8">

android:layout_width="match_parent"

android:layout_height="48dp"

android:layout_margin="8dp"

android:background="@android:color/white"

android:gravity="center_vertical">

android:id="@+id/btn_back"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="6dp"

android:layout_marginRight="6dp"

android:padding="6dp"

android:src="@drawable/ic_arrow_left"

android:tint="@android:color/darker_gray" />

android:id="@+id/edit_search"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_weight="1"

android:background="@android:color/white"

android:hint="搜索知乎内容"

android:imeOptions="actionSearch"

android:inputType="text"

android:maxLines="1" />

android:id="@+id/btn_searchdelete"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:paddingLeft="6dp"

android:paddingRight="6dp"

android:src="@drawable/ic_delete"

android:tint="@android:color/darker_gray"

android:visibility="gone"

tools:visibility="visible" />

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/recommandsearch"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp">

android:layout_width="match_parent"

android:layout_height="48dp"

android:gravity="center_vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="6dp"

android:padding="6dp"

android:src="@drawable/ic_search" />

android:id="@+id/tv_recommandsearch"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginLeft="16dp"

android:gravity="center_vertical"

tools:text="演技能烂到什么程度"

android:textColor="@android:color/black"

android:textSize="16dp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/listview_search_history"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

android:id="@+id/btn_clearall"

android:layout_width="match_parent"

android:layout_height="48dp"

android:gravity="center"

android:text="清除历史记录"

android:textColor="@android:color/holo_blue_light" />

item

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="48dp"

android:layout_marginLeft="12dp"

android:layout_marginRight="12dp">

android:id="@+id/icon"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_centerVertical="true"

android:paddingRight="6dp"

android:src="@drawable/ic_history"

android:tint="@android:color/darker_gray" />

android:id="@+id/tv_recommandsearch"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginLeft="16dp"

android:layout_marginRight="8dp"

android:layout_toLeftOf="@id/btn_delete"

android:layout_toRightOf="@id/icon"

android:ellipsize="end"

android:gravity="center_vertical"

android:lines="1"

android:text="演技能烂到什么程度"

android:textSize="16dp" />

android:id="@+id/btn_delete"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:paddingLeft="6dp"

android:src="@drawable/ic_delete"

android:tint="@android:color/darker_gray" />

android:layout_width="match_parent"

android:layout_height="0.5dp"

android:layout_alignParentBottom="true"

android:background="@android:color/black" />

所有ic_的图片为android studio Vector Asset

Adapter

public class SearchAdapter extends RecyclerView.Adapter {

private Context context;

private List list;

public SearchAdapter(Context context, List list) {

this.context = context;

this.list = list;

}

@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_search_history, parent, false));

}

@Override

public void onBindViewHolder(ViewHolder holder, int position) {

holder.tvRecommandsearch.setText(list.get(position).getName());

holder.btnDelete.setOnClickListener(view -> deleteListener.OnDelete(position));

holder.itemView.setOnClickListener(view -> itemClickListener.OnItemClick(position));

}

@Override

public int getItemCount() {

return list.size();

}

class ViewHolder extends RecyclerView.ViewHolder {

@BindView(R.id.tv_recommandsearch)

TextView tvRecommandsearch;

@BindView(R.id.btn_delete)

ImageView btnDelete;

ViewHolder(View itemView) {

super(itemView);

ButterKnife.bind(this, itemView);

}

}

private OnDeleteListener deleteListener;

private OnItemClickListener itemClickListener;

public interface OnDeleteListener {

void OnDelete(int position);

}

public interface OnItemClickListener {

void OnItemClick(int position);

}

public void setOnDeleteListener(OnDeleteListener deleteListener) {

this.deleteListener = deleteListener;

}

public void setOnItemClickListener(OnItemClickListener itemClickListener) {

this.itemClickListener = itemClickListener;

}

}

Activity

public class SearchActivity extends BaseActivity {

@BindView(R.id.btn_back)

ImageView btnBack;

@BindView(R.id.edit_search)

EditText editSearch;

@BindView(R.id.btn_searchdelete)

ImageView btnSearchdelete;

@BindView(R.id.tv_recommandsearch)

TextView tvRecommandsearch;

@BindView(R.id.recommandsearch)

CardView recommandSearch;

@BindView(R.id.listview_search_history)

RecyclerView listview;

@BindView(R.id.btn_clearall)

TextView btnClearall;

private final int DELETEONE = 0X001;

private final int DELETEALL = 0X002;

private SearchAdapter adapter;

private List list;

@Override

protected void bindViews() {

setContentView(R.layout.activity_search);

}

@Override

protected void initView() {

}

@Override

protected void initData() {

tvRecommandsearch.setText(getIntent().getStringExtra("recommandsearch"));

recommandSearch.setOnClickListener(view -> {

editSearch.setText(tvRecommandsearch.getText());

insertHistory();

});

list = new ArrayList<>();

adapter = new SearchAdapter(this, list);

listview.setLayoutManager(new LinearLayoutManager(this));

listview.setAdapter(adapter);

adapter.setOnDeleteListener(position -> deleteHistory(DELETEONE, position));

adapter.setOnItemClickListener(position -> {

editSearch.setText(list.get(position).getName());

insertHistory();

});

btnClearall.setOnClickListener(view -> showDeleteDialog());

queryHistory();

}

@Override

protected void initActionBar() {

btnBack.setOnClickListener(view -> finish());

editSearch.setOnEditorActionListener((textView, i, keyEvent) -> {

if (i == EditorInfo.IME_ACTION_SEARCH && !TextUtils.isEmpty(editSearch.getText().toString().trim())) {

ToastUtils.shortToast(editSearch.getText().toString().trim());

insertHistory();

}

return true;

});

editSearch.addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override

public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

if (charSequence.toString().length() > 0) {

btnSearchdelete.setVisibility(View.VISIBLE);

} else {

btnSearchdelete.setVisibility(View.GONE);

}

}

@Override

public void afterTextChanged(Editable editable) {

}

});

btnSearchdelete.setOnClickListener(view -> editSearch.setText(""));

}

private void showDeleteDialog() {

new AlertDialog.Builder(this)

.setMessage("确认清除所有搜索记录吗?")

.setPositiveButton("确定", (dialogInterface, i) -> deleteHistory(DELETEALL, 1))

.setNegativeButton("取消", null)

.setCancelable(true)

.create().show();

}

private void insertHistory() {

SearchHistory searchHistory = new SearchHistory();

searchHistory.setName(editSearch.getText().toString().trim());

SearchHistoryDao.insertHistory(searchHistory);

queryHistory();

}

private void deleteHistory(int TAG, int position) {

if (TAG == DELETEONE)

SearchHistoryDao.deleteHistory(list.get(position));

else if (TAG == DELETEALL)

SearchHistoryDao.clearAll();

queryHistory();

}

private void queryHistory() {

list.clear();

list.addAll(SearchHistoryDao.queryAll());

Collections.reverse(list);

adapter.notifyDataSetChanged();

}

}

SearchHistoryDao有命名问题的坑,踩踩更健康

Android浏览历史sqlite功能,[Android]greendao实现搜索历史功能相关推荐

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

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

  2. android 搜索历史流布局,Android-流布局-FlowLayout在搜索历史中的应用-0920.doc

    Android-搜索历史的实现+FlowLayout应用-(2016-9-20) 项目: SearchModel29 环境: Android Studio 1.0 项目下载地址: /s/1hrKnd5 ...

  3. 乐视android版本怎么升级,乐视网android手机客户端升级推出V2.0版

    乐视网 android手机客户端V2.0版--"乐视影视"正式发布,据乐视网运营副总裁高飞介绍,"V2.0版是早期发布的乐视网android手机客户端V1.5版的升级版本 ...

  4. GreenDao+SearchView+FlowLoyout实现搜索历史和热门搜索

    之前写过一个静态的搜索页 FlowLayout流式布局实现标签.类似热门搜索这种效果 只是能实现界面效果,但是往往开发中是要把搜索历史缓存到本地数据库中,所以在原基础上添加了数据库功能. 并且把搜索框 ...

  5. 搜索功能(六)-清空历史关键字

    清空历史关键字 清空本地存储个历史记录, clearHistory () {// 清空搜索关键字的历史信息// 清空的是本地存储的数据(清空本地存储的数据并不会影响data中的数据)mpvue.cle ...

  6. php 实现联想式 搜索,PHP实现搜索联想功能(基于字典树算法)

    搜索联想功能是各大搜索引擎具备的基础功能,如下图所示,这个功能简化了用户的输入行为,并且能够给用户推荐热门的搜索词,下面我们来讲一下如何用php实现搜索联想的功能. 实现原理 搜索联想功能拆解一下由两 ...

  7. javascript搜索框联想搜索_JavaScript实现搜索联想功能

    -.虽然Jquery已经有了一个完整的包 实现前端搜索联想功能,但是出于学习还是想了解一下实现此功能的原理性 回想起来 实现此功能很简单,1.前端输入字符串 文本改变 异步请求服务器 将返回的资料显示 ...

  8. 通过jQuery实现淘宝搜索提示功能

    一.先来展示下功能: 淘宝搜索提示功能 二.实现: 1.大体实现思路: 先从input框里获得输入的内容,再把得到的内容通过jQuery封装的ajax以jsonp的形式发送出去.接着把响应回来的数据渲 ...

  9. Android原生SQLite操作以及greenDao框架操作SQLite

    本文分为2个大的方面来讲SQLite操作:原生操作,框架操作 原生操作 首先我们要创建一个数据库打开帮助类 ,目的是创建数据库和表,升级数据库 import android.content.Conte ...

最新文章

  1. linux与windows下开发,Linux 与 Windows下开发感受
  2. redux-form(V7.4.2)笔记(一)
  3. 只允许特定的组用户su切换到root
  4. 13002.tcp客户端程序(python)
  5. vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
  6. 单目视觉里程计的尺度问题的疑问?
  7. python设置很大的刻度_【Matplotlib】设置刻度(1)
  8. java 0点时间_java 获取当前时间与零点的时间差
  9. PQ分区魔术师v9.0 中文版
  10. 2021年电赛F题智能送药小车(国二)开源分享
  11. 【技术分享】Win10 wampserver升级安装php7.2.32
  12. ES 索引创建及查询
  13. windows挂载webdav
  14. 阿里云OSS文件上传,后台签名方案
  15. java杂谈(瞎吉尔找的练习)
  16. 怎么用计算机进行曲线拟合,excel怎么进行曲线拟合 excel曲线拟合图文教程
  17. 电脑不小心被格式化了 里面的应用软件如何恢复?
  18. flowable+tomcat部署flowable项目,在线画流程图
  19. hbase报错总结01_李孟_新浪博客
  20. LEHDLAB_实验流程

热门文章

  1. 天行未连接服务器未响应,WOW 奥拉基尔服务器好吗? 人口和各个方面都怎么样?...
  2. python 判断图片的类型
  3. 足迹APP简单开发实例
  4. 如何在C艹大作业上用复数计算器拿下一个100分
  5. 关于CSS--基础样式、盒子模型和颜色
  6. Go语言(Golang)高并发处理思路
  7. 苹果手机计算机的使用记录,苹果iPhone手机求一款记录日常工作内容的便签app
  8. 区块链+汽车供应链物流服务平台“运链盟”正式上线,已有融资款发放
  9. 《MySQL 深入浅出》 1-17章节 阅读整理
  10. CreateCompatibleDC()和GetDC()区别在哪里