EditText+listview+数据库操作实现搜索功能

来源:互联网 发布:键盘侠网络暴力的危害 编辑:程序博客网 时间:2024/04/30 23:27

实现搜索功能方式有哪些

android搜索框功能是非常常见的,实现搜索框的方式有很多种,常见的有这三种:
- SearchView
- autocompletetextview
- EditText
- 自定义方式


EditText+listview+数据库

本文主要讲述以下这种方式,不建议使用sp存储。sp存储不好控制,而且没有数据库的方式实现起来简单,方便以后的管理(属不定需要增加需求了呢)

  • 先看效果图:
    这里写图片描述

确定所需的搜索功能是什么样的需求

本文提供的是以下需求:

  • 输入关键字,点击搜索后,保存输入的关键字,跳转对应的搜索结果界面
  • 再次进入有搜索功能的界面,输入关键字自动查询数据裤,把数据显示出来(只有输入关键字才会显示搜索历史,默认是不显示的)
  • 清空历史数据

1.准备一个数据库帮助类SearchRecordSQHelper,来创建一个保存搜索历史的表

/** * Created by Administrator on 2017/5/14. */public class SearchRecordSQHelper extends SQLiteOpenHelper {    private static String name = "mysearch.db";    private static Integer version = 1;    public SearchRecordSQHelper(Context context) {        super(context, name, null, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        //打开数据库,建立了一个叫records的表,里面只有一列name来存储历史记录:        db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

2.在oncreat中实例化这个帮助类

    SearchRecordSQHelper helper = new SearchRecordSQHelper(this);    //进入界面,历史记录是默认显示的(测试)   // queryRecords("")

queryRecords(String tempName)查询数据

 /*     *模糊查询数据 并显示在ListView列表上     * */    private void queryRecords(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);            list_result.setAdapter(adapter);            adapter.notifyDataSetChanged();    }

3.在EditText中输入关键字,点击搜索查询

 String et_text = et.getText().toString().toString().trim();                if(et_text.length()==0){                    return;                }                //isExistData是否存在历史记录,返回一个布尔值                boolean is_existData = isExistData(et_text);                if (!is_existData) {                    insertRecords(et_text);//插入数据                    //数据库中插入数据后,再次查询显示数据,这里是为了测试,真实情况应该直接跳转一个界面的                    queryRecords("");                }                //根据输入的内容模糊查询数据结果,并跳转到另一个界面,这个根据需求实现                Toast.makeText(MainActivity.this,"搜索结果:"+et_text, Toast.LENGTH_SHORT).show();

isExistData是否存在历史记录,返回一个布尔值

 /**     * 是否存在数据,返回boolean     */    private boolean isExistData(String tempName) {        //从records这个表里找到name=tempName的id        Cursor cursor = helper.getReadableDatabase().rawQuery(                "select id as _id,name from records where name =?", new String[]{tempName});        //判断是否有下一个        return cursor.moveToNext();    }

insertRecords(et_text)插入数据

 /*     *插入数据     * */    private void insertRecords(String tempName) {        //历史记录的字段:tempName        db = helper.getWritableDatabase();        db.execSQL("insert into records(name) values('" + tempName + "')");        db.close();    }

再次进入有搜索功能的界面,输入关键字,动态查询数据库,匹配相应数据,显示出来

  • 这里需要用到TextWatcher,来对edittext输入的信息进行实时监听
//在EditText中每次输入信息,都会依次调用这三个方法  et.addTextChangedListener(new TextWatcher() {            @Override            public void beforeTextChanged(CharSequence s, int start, int count, int after) {            //文本输入之前调用            }            @Override            public void onTextChanged(CharSequence s, int start, int before, int count) {            //文本输入中调用            }            @Override            public void afterTextChanged(Editable s) {             //文本输入完调用            }        });
  • 功能实现(输入关键字,查询数据,显示出来)
 @Override    public void afterTextChanged(Editable s) {        //文字输入完成调用        if (s.toString().trim().length() != 0) {            list_result.setVisibility(View.VISIBLE);            clearRecord.setVisibility(View.VISIBLE);            serch_result.setVisibility(View.VISIBLE);        }        //每次输入后都查询数据库并显示        //根据输入的值去模糊查询数据库中有没有数据        String tempName = et.getText().toString().trim();        queryRecords(tempName);    }

清空数据

 /**     * 清空数据     */    private void clearRecord() {        db = helper.getWritableDatabase();        db.execSQL("delete from records");        db.close();    }

到这里基本上完成了,什么点击事件的都没写,本文主要时提供一个思路,具体需要什么功能,还需要根据实际情况定制!

demo下载:http://download.csdn.net/detail/qq_34501274/9842502

0 2
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办 玩cf手游手机屏幕摩擦力大怎么办 网吧有战地1没有橘子平台怎么办 俩人打仗了对方想讹我怎么办 环世界模组装多了打不开怎么办 手机百度云视频播放画面太小怎么办 ps文件说数据似乎已经损坏怎么办 百度云中的压缩包下载的很慢怎么办 游戏压缩出现未知错误或损坏怎么办 百度云里的压缩包解压后损坏怎么办 联创打印时显示压缩文件失败怎么办 电脑的软件打开出现未知格式怎么办 图片只突出人物边上全黑怎么办 合金机兵存档密码忘了怎么办 手机网页验证码无法加载插件怎么办 绝地求生次激战场机型不支持怎么办 木茷生存中文版安装包损坏了怎么办 手机下载软件显示安装包损坏怎么办 不小心把qq图片删了怎么办 奶水不足宝宝不好好吸奶怎么办 膀胱切除前列腺切除阴茎不硬怎么办 小孩的睾丸睾丸碰肿了怎么办 怎么判断小孩子的睾丸没下来怎么办 怀孕39周腰酸屁股酸疼该怎么办 我儿子18岁睾丸筋鼓起来怎么办 去医院检查说精子跑的慢怎么办 多囊卵巢综合症引起屁股增大怎么办 蚊子咬了肿了挠破了流水怎么办 血糖高引发的睾丸一直烂怎么办? 被洪水淹过的猪后期怎么办 做睾丸阴囊彩超阴茎突然勃起怎么办 阴茎冠状沟皮肤感染总不愈合怎么办 不小心咬到孩子破皮了怎么办 小孩子不小心碰到脸黑了一块怎么办