实现搜索功能方式有哪些
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();
}
到这里基本上完成了,什么点击事件的都没写,本文主要时提供一个思路,具体需要什么功能,还需要根据实际情况定制!