本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: 
- 数据库的增删改查操作 
- ListView和ScrollView的嵌套冲突解决 
- 监听软键盘回车按钮设置为搜索按钮 
- 使用TextWatcher( )实时筛选 
- 已搜索的关键字再次搜索不重复添加到数据库 
- 刚进入页面设置软键盘不因为EditText而自动弹出

代码

RecordSQLiteOpenHelper.java

package com.cwvs.microlife;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {private static String name = "temp.db";private static Integer version = 1;public RecordSQLiteOpenHelper(Context context) {super(context, name, null, version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

MainActivity.java

package com.cwvs.microlife;import java.util.Date;import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {private EditText et_search;private TextView tv_tip;private MyListView listView;private TextView tv_clear;private RecordSQLiteOpenHelper helper = new RecordSQLiteOpenHelper(this);;private SQLiteDatabase db;private BaseAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);// 初始化控件initView();// 清空搜索历史tv_clear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {deleteData();queryData("");}});// 搜索框的键盘搜索键点击回调et_search.setOnKeyListener(new View.OnKeyListener() {// 输入完后按键盘上的搜索键public boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {// 修改回车键功能// 先隐藏键盘((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);// 按完搜索键后将当前查询的关键字保存起来,如果该关键字已经存在就不执行保存boolean hasData = hasData(et_search.getText().toString().trim());if (!hasData) {insertData(et_search.getText().toString().trim());queryData("");}// TODO 根据输入的内容模糊查询商品,并跳转到另一个界面,由你自己去实现Toast.makeText(MainActivity.this, "clicked!", Toast.LENGTH_SHORT).show();}return false;}});// 搜索框的文本变化实时监听et_search.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {if (s.toString().trim().length() == 0) {tv_tip.setText("搜索历史");} else {tv_tip.setText("搜索结果");}String tempName = et_search.getText().toString();// 根据tempName去模糊查询数据库中有没有数据queryData(tempName);}});listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {TextView textView = (TextView) view.findViewById(android.R.id.text1);String name = textView.getText().toString();et_search.setText(name);Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();// TODO 获取到item上面的文字,根据该关键字跳转到另一个页面查询,由你自己去实现}});// 插入数据,便于测试,否则第一次进入没有数据怎么测试呀?Date date = new Date();long time = date.getTime();insertData("Leo" + time);// 第一次进入查询所有的历史记录queryData("");}/*** 插入数据*/private void insertData(String tempName) {db = helper.getWritableDatabase();db.execSQL("insert into records(name) values('" + tempName + "')");db.close();}/*** 模糊查询数据*/private void queryData(String tempName) {Cursor cursor = helper.getReadableDatabase().rawQuery("select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);// 创建adapter适配器对象adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);// 设置适配器listView.setAdapter(adapter);adapter.notifyDataSetChanged();}/*** 检查数据库中是否已经有该条记录*/private boolean hasData(String tempName) {Cursor cursor = helper.getReadableDatabase().rawQuery("select id as _id,name from records where name =?", new String[]{tempName});//判断是否有下一个return cursor.moveToNext();}/*** 清空数据*/private void deleteData() {db = helper.getWritableDatabase();db.execSQL("delete from records");db.close();}private void initView() {et_search = (EditText) findViewById(R.id.et_search);tv_tip = (TextView) findViewById(R.id.tv_tip);listView = (com.cwvs.microlife.MyListView) findViewById(R.id.listView);tv_clear = (TextView) findViewById(R.id.tv_clear);// 调整EditText左边的搜索按钮的大小Drawable drawable = getResources().getDrawable(R.drawable.search);drawable.setBounds(0, 0, 60, 60);// 第一0是距左边距离,第二0是距上边距离,60分别是长宽et_search.setCompoundDrawables(drawable, null, null, null);// 只放左边}
}

MyListView.java

package com.cwvs.microlife;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;public class MyListView extends ListView {public MyListView(Context context) {super(context);}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);}public MyListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:focusableInTouchMode="true"android:orientation="vertical"tools:context="${relativePackage}.${activityClass}"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="50dp"android:background="#E54141"android:orientation="horizontal"android:paddingRight="16dp"><ImageViewandroid:layout_width="45dp"android:layout_height="45dp"android:layout_gravity="center_vertical"android:padding="10dp"android:src="@drawable/back" /><EditTextandroid:id="@+id/et_search"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="@null"android:drawableLeft="@drawable/search"android:drawablePadding="8dp"android:gravity="start|center_vertical"android:hint="输入查询的关键字"android:imeOptions="actionSearch"android:singleLine="true"android:textColor="@android:color/white"android:textSize="16sp" /></LinearLayout><ScrollViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:paddingLeft="20dp"><TextViewandroid:id="@+id/tv_tip"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="left|center_vertical"android:text="搜索历史" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#EEEEEE"></View><com.cwvs.microlife.MyListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content"></com.cwvs.microlife.MyListView></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#EEEEEE"></View><TextViewandroid:id="@+id/tv_clear"android:layout_width="match_parent"android:layout_height="40dp"android:background="#F6F6F6"android:gravity="center"android:text="清除搜索历史" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:layout_marginBottom="20dp"android:background="#EEEEEE"></View></LinearLayout></ScrollView>
</LinearLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助。

转自:http://www.aspku.com/kaifa/android/117179.html

转载于:https://www.cnblogs.com/Jingerxin/p/5323063.html

Android实现搜索功能并本地保存搜索历史记录相关推荐

  1. gorm preload 搜索_macOS系统本地文件搜索工具

    Find Any File Mac可以准确快速地查找本次磁盘甚至是本地隐藏磁盘上的任何文件,Find Any File Mac不使用数据库,而是使用文件系统驱动程序的快速搜索操作,包括能够搜索到通常隐 ...

  2. Android搜索功能的案例,本地保存搜索历史记录

    同事负责开发的APP有一个搜索功能,并且需要显示搜索的历史记录,我闲暇之余帮她开发了这个功能,现把该页面抽取成一个demo分享给大家. 实现效果如图所示: 本案例实现起来很简单,所以可以直接拿来嵌入项 ...

  3. android搜索功能xml,Android_Android ActionBar搜索功能用法详解,本文实例讲述了Android ActionBar - phpStudy...

    Android ActionBar搜索功能用法详解 本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意 ...

  4. Android简单实现搜索功能 显示清除历史搜索记录

    本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下. 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及 ...

  5. android实现通知栏搜索功能,actionBar+SearchView实现搜索功能

    在项目中有使用到ActionBar和SearchView,下面做一个总结以方便以后使用. 一.搜索控件:SearchView(SDK Version >=11) (一)比较重要的方法和属性: 1 ...

  6. win7计算机搜索功能没有了,win7搜索功能不能用了怎么办|win7搜索功能不见了怎么解决? - 学无忧...

    在Win7中搜索功能相对于WinXP来讲使用越来越方便,随便打开一个文件夹,点击右上角的"搜索"文本框,输入自己需要搜索的内容就可以进行文件搜索了,但最近有网友提到win7搜索功能 ...

  7. phpsotrm怎么 搜索功能_Windows 10 网络搜索设计太反人类?教你如何彻底关闭它

    来源:太平洋电脑网 我们知道微软在Windows 10中,特别加强了系统的搜索功能,但Windows 10的搜索的确很难称得上好用.抛开效率低下.呈现结果少.造成系统卡顿等老生常谈的问题不论,在功能设 ...

  8. 计算机的搜索功能无法启用,电脑搜索功能失效的修复方法

    最近,很多用户表示,电脑在没有做任何设置的情况下,搜索功能便无法使用了,导致用户查找东西的时候非常麻烦.对此,我们该如何解决呢?下面,我们一起来看看电脑搜索功能失效的修复方法. 问题故障: 当进行完系 ...

  9. vue 移动端搜索功能(带历史搜索记录)

    实现效果如图: 实现的功能: 1.点击搜索,把搜索的值存入本地记录,并展示 2.搜索相同的值,要删除旧数据,把新数据放进数组首位 3.清空历史记录 html代码: <div class=&quo ...

最新文章

  1. 深入理解ROS技术 【2】ROS下的模块详解(66-128)
  2. range方法在Python2和Python3中的不同
  3. aws数据库同步区别_了解如何通过使用AWS AppSync构建具有实时数据同步的应用程序
  4. eclipse 下安装插件
  5. 如何衡量研发效能?阿里资深技术专家提出了5组指标 1
  6. linux aix 环境,Aix5.3安装Bash环境
  7. Hadoop 快速入门
  8. 常用十六进制颜色对照表代码
  9. 软件测试需要掌握哪些技术?
  10. 语音转换成文字要怎么做呢?
  11. IDEA中suppress warnings
  12. 《设计模式之禅》-原型模式
  13. 微博和微信的区别之处在哪里?
  14. 浅谈数码相机成像中 ISO(感光度)的作用
  15. JavaScript头像图片上传插件支持上传类型大小尺寸验证
  16. [经验教程]2022京东618红包活动时间是什么时候开始什么时候结束及怎么领取京东618红包?
  17. 基因数据处理52之cs-bwamem集群版运行(1千万条100bp的reads)
  18. gradle-6.5.1-all 快速下载
  19. 2021.12.11 烹饪
  20. Axure RP9 ——原型预览

热门文章

  1. SAP_增强案例_MB51(物料凭证清单)新增客户化字段
  2. C#实现打字小游戏(一)
  3. Java 检查文件后生成8位随机数
  4. Ubuntu20.04上切换系统声音( by quqi99)
  5. 苹果手机如何多开双开 iPhone分身教程
  6. 免费分享Redis从入门到精通的优秀图书
  7. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
  8. CUMTOJ:algorithm-沙子的质量(题解)
  9. 数据库系统概念(机械工业出版社,第六版)复习——第八章:关系数据库设计
  10. c4d流体插件_c4d流体插件下载|C4D流体模拟插件(Jawset TurbulenceFD)下载v1.0 Rev1372 官方最新版_ IT猫扑网...