失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android简单实现搜索功能 显示清除历史搜索记录

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

时间:2023-02-18 19:34:08

相关推荐

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

本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下。

本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及到的知识点:

1、数据库的增删改查操作

2、监听软键盘回车按钮设置为搜索按钮

3、使用TextWatcher( )进行实时筛选

4、已搜索的关键字再次搜索不会重复添加到数据库

既然是要保存搜索记录,首先得建立数据库表:

/*** 搜索记录帮助类* Created by 05 on /7/27.*/public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {private final static String DB_NAME = "temp.db";private final static int DB_VERSION = 1;public RecordSQLiteOpenHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {String sqlStr = "CREATE TABLE IF NOT EXISTS records (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);";db.execSQL(sqlStr);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

数据库操作类 ,增删改查都在里面:

/*** 搜索记录操作类* Created by 05 on /7/27.*/public class RecordsDao {RecordSQLiteOpenHelper recordHelper;SQLiteDatabase recordsDb;public RecordsDao(Context context) {recordHelper = new RecordSQLiteOpenHelper(context);}//添加搜索记录public void addRecords(String record) {if (!isHasRecord(record)) {recordsDb = recordHelper.getReadableDatabase();ContentValues values = new ContentValues();values.put("name", record);//添加recordsDb.insert("records", null, values);//关闭recordsDb.close();}}//判断是否含有该搜索记录public boolean isHasRecord(String record) {boolean isHasRecord = false;recordsDb = recordHelper.getReadableDatabase();Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);while (cursor.moveToNext()) {if (record.equals(cursor.getString(cursor.getColumnIndexOrThrow("name")))) {isHasRecord = true;}}//关闭数据库recordsDb.close();cursor.close();return isHasRecord;}//获取全部搜索记录public List<String> getRecordsList() {List<String> recordsList = new ArrayList<>();recordsDb = recordHelper.getReadableDatabase();Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));recordsList.add(name);}//关闭数据库recordsDb.close();cursor.close();return recordsList;}//模糊查询public List<String> querySimlarRecord(String record){String queryStr = "select * from records where name like '%" + record + "%' order by name ";List<String> similarRecords = new ArrayList<>();Cursor cursor= recordHelper.getReadableDatabase().rawQuery(queryStr,null);while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));similarRecords.add(name);}cursor.close();return similarRecords;}//清空搜索记录public void deleteAllRecords() {recordsDb = recordHelper.getWritableDatabase();recordsDb.execSQL("delete from records");recordsDb.close();}}

数据库类已经封装好了,接下来就是界面代码:

<span style="color:#333333;"><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:background="@color/base_green"android:layout_width="match_parent"android:layout_height="50dp"><LinearLayoutandroid:layout_margin="10dp"android:background="@drawable/input_border_layout"android:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent"><ImageViewandroid:padding="5dp"android:layout_gravity="center_vertical"android:layout_width="30dp"android:layout_height="match_parent"android:src="@mipmap/my_village_search"/><EditTextandroid:id="@+id/input_search_content_et"android:layout_margin="5dp"android:textSize="14sp"android:singleLine="true"android:imeOptions="actionSearch"android:layout_gravity="center_vertical"android:background="@drawable/input_no_border_layout"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入你要搜索的内容"/></span><!-- 以上的singleLine和imeOptions属性代码是将弹出的软键盘的回车键替换成搜索键的关键,当然也可以换成发送键 等等,可以去查一下该属性 --></span></LinearLayout><TextViewandroid:id="@+id/search_content_cancel_tv"android:padding="10dp"android:layout_gravity="center_vertical"android:gravity="center"android:layout_width="wrap_content"android:layout_height="match_parent"android:textSize="18sp"android:text="取消"android:textColor="@color/white"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:id="@+id/search_content_show_ll"android:layout_width="match_parent"android:layout_height="wrap_content"></LinearLayout></RelativeLayout></LinearLayout></span>

因为是将搜索的历史信息做成显示隐藏的效果,所以单独写了一个历史信息的layout:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><ListViewandroid:id="@+id/search_records_lv"android:layout_width="match_parent"android:layout_height="wrap_content"/><Viewandroid:layout_width="match_parent"android:layout_height="0.1dp"android:background="@color/custom_gray"/><TextViewandroid:background="@color/white"android:id="@+id/clear_all_records_tv"android:layout_width="match_parent"android:layout_height="40dp"android:textSize="16sp"android:gravity="center"android:textColor="@color/clear_red"android:text="清除历史记录"/><Viewandroid:layout_width="match_parent"android:layout_height="0.1dp"android:background="@color/custom_gray"/></LinearLayout></LinearLayout>

既然用到了listview来显示历史搜索信息,就需要写listview的item:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:background="@color/white"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="40dp"><TextViewandroid:id="@+id/search_content_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:drawableLeft="@mipmap/search_icon"android:drawablePadding="8dp"android:layout_margin="10dp"android:layout_gravity="center_vertical"/></LinearLayout></LinearLayout>

用到了listview,当然还需要适配器,因为目前只有文本可以使用SimpleAdapter,为了以后能添加别的,我还是自定义了一个Adapter:

/*** Created by 05 on /7/27.*/public class SearchRecordsAdapter extends BaseAdapter {private Context context;private List<String> searchRecordsList;private LayoutInflater inflater;public SearchRecordsAdapter(Context context, List<String> searchRecordsList) {this.context = context;this.searchRecordsList = searchRecordsList;inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return searchRecordsList.size() == 0 ? 0 : searchRecordsList.size();}@Overridepublic Object getItem(int position) {return searchRecordsList.size() == 0 ? null : searchRecordsList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if(null == convertView){viewHolder = new ViewHolder();convertView = inflater.inflate(R.layout.saerch_records_list_item,null);viewHolder.recordTv = (TextView) convertView.findViewById(R.id.search_content_tv);convertView.setTag(viewHolder);}else{viewHolder = (ViewHolder) convertView.getTag();}String content = searchRecordsList.get(position);viewHolder.recordTv.setText(content);return convertView;}private class ViewHolder {TextView recordTv;}}

最后就是界面代码了:

/*** 搜索界面* Created by 05 on /7/26.*/public class SearchContentActivity extends BaseActivity implements View.OnClickListener {private EditText searchContentEt;private SearchRecordsAdapter recordsAdapter;private View recordsHistoryView;private ListView recordsListLv;private TextView clearAllRecordsTv;private LinearLayout searchRecordsLl;private List<String> searchRecordsList;private List<String> tempList;private RecordsDao recordsDao;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);BaseSetContentView(R.layout.activity_search_content);initView();initData();bindAdapter();initListener();}private void initView() {setHideHeader();initRecordsView();searchRecordsLl = (LinearLayout) findViewById(R.id.search_content_show_ll);searchContentEt = (EditText) findViewById(R.id.input_search_content_et);//添加搜索viewsearchRecordsLl.addView(recordsHistoryView);}//初始化搜索历史记录Viewprivate void initRecordsView() {recordsHistoryView = LayoutInflater.from(this).inflate(R.layout.search_records_list_layout, null);//显示历史记录lvrecordsListLv = (ListView) recordsHistoryView.findViewById(R.id.search_records_lv);//清除搜索历史记录clearAllRecordsTv = (TextView) recordsHistoryView.findViewById(R.id.clear_all_records_tv);}private void initData() {recordsDao = new RecordsDao(this);searchRecordsList = new ArrayList<>();tempList = new ArrayList<>();tempList.addAll(recordsDao.getRecordsList());reversedList();//第一次进入判断数据库中是否有历史记录,没有则不显示checkRecordsSize();}private void bindAdapter() {recordsAdapter = new SearchRecordsAdapter(this, searchRecordsList);recordsListLv.setAdapter(recordsAdapter);}private void initListener() {clearAllRecordsTv.setOnClickListener(this);searchContentEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == EditorInfo.IME_ACTION_SEARCH) {if (searchContentEt.getText().toString().length() > 0) {String record = searchContentEt.getText().toString();//判断数据库中是否存在该记录if (!recordsDao.isHasRecord(record)) {tempList.add(record);}//将搜索记录保存至数据库中recordsDao.addRecords(record);reversedList();checkRecordsSize();recordsAdapter.notifyDataSetChanged();//根据关键词去搜索} else {ToastUtils.showToast(SearchContentActivity.this, "搜索内容不能为空");}}return false;}});//根据输入的信息去模糊搜索searchContentEt.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) {String tempName = searchContentEt.getText().toString();tempList.clear();tempList.addAll(recordsDao.querySimlarRecord(tempName));reversedList();checkRecordsSize();recordsAdapter.notifyDataSetChanged();}});//历史记录点击事件recordsListLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//将获取到的字符串传到搜索结果界面}});}//当没有匹配的搜索数据的时候不显示历史记录栏private void checkRecordsSize(){if(searchRecordsList.size() == 0){searchRecordsLl.setVisibility(View.GONE);}else{searchRecordsLl.setVisibility(View.VISIBLE);}}@Overridepublic void onClick(View v) {switch (v.getId()){//清空所有历史数据case R.id.clear_all_records_tv:tempList.clear();reversedList();recordsDao.deleteAllRecords();recordsAdapter.notifyDataSetChanged();searchRecordsLl.setVisibility(View.GONE);break;}}//颠倒list顺序,用户输入的信息会从上依次往下显示private void reversedList(){searchRecordsList.clear();for(int i = tempList.size() - 1 ; i >= 0 ; i --){searchRecordsList.add(tempList.get(i));}}}

以上就是实现搜索记录存储,搜索信息模糊查询的全部代码了,供大家参考,当然也给自己提供一个整理思路的锻炼。O(∩_∩)O~

如果觉得《Android简单实现搜索功能 显示清除历史搜索记录》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。