searchView的简单实现
在Android开发中,`SearchView`是一个非常常用的组件,它为用户提供了一个搜索界面,可以方便地在应用中进行内容检索。本篇文章将详细介绍如何在Android中实现`SearchView`的基本功能,并结合`ListView`展示搜索结果。我们将从以下几个方面进行讨论: 1. **SearchView介绍** `SearchView`是Android SDK中的一个视图组件,通常位于ActionBar或Toolbar上,用于提供用户输入查询字符串的界面。它可以与`AutoCompleteTextView`集成,提供自动补全建议,也可以连接到`Filterable`接口的实现,以过滤和显示搜索结果。 2. **添加SearchView到布局** 要在XML布局文件中添加`SearchView`,可以在`<menu>`标签内定义一个`<item>`,并设置其`android:actionViewClass`属性为`android.widget.SearchView`。例如: ```xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@android:drawable/ic_menu_search" app:showAsAction="always|collapseActionView" app:actionViewClass="android.widget.SearchView" /> </menu> ``` 3. **监听SearchView事件** 在Activity或Fragment中,我们需要监听`SearchView`的事件,如查询文本的变化、查询的提交等。这可以通过重写`onOptionsItemSelected(MenuItem item)`方法来实现: ```java @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.search) { SearchView searchView = (SearchView) item.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 用户点击搜索按钮时执行的代码 return false; } @Override public boolean onQueryTextChange(String newText) { // 查询文本改变时执行的代码 return false; } }); } return super.onOptionsItemSelected(item); } ``` 4. **实现Filterable接口** 为了过滤数据并显示在`ListView`中,你需要创建一个实现了`Filterable`接口的Adapter。`getFilter()`方法会返回一个`Filter`对象,该对象负责过滤数据并更新列表。例如: ```java public class MyAdapter extends ArrayAdapter<MyItem> implements Filterable { private List<MyItem> originalList; private List<MyItem> filteredList; // 构造函数和其它方法... @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { // 根据约束条件过滤数据 FilterResults results = new FilterResults(); if (constraint != null && constraint.length() > 0) { List<MyItem> filtered = new ArrayList<>(); for (MyItem item : originalList) { if (item.getName().contains(constraint.toString())) { filtered.add(item); } } results.values = filtered; results.count = filtered.size(); } else { results.values = originalList; results.count = originalList.size(); } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredList = (List<MyItem>) results.values; notifyDataSetChanged(); } }; } } ``` 5. **更新ListView** 当查询文本发生变化时,调用`Adapter`的`getFilter()`方法过滤数据,然后更新`ListView`: ```java searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { adapter.getFilter().filter(newText); return false; } }); ``` 6. **优化用户体验** 为了提供更好的用户体验,可以考虑以下几点: - 在用户输入时即时显示搜索结果,而不仅仅是提交查询时。 - 提供自动补全功能,通过`ArrayAdapter`或`CursorAdapter`实现。 - 处理空查询,当用户清空搜索框时,恢复原始数据列表。 - 添加清除图标,允许用户快速清空搜索框。 总结,`SearchView`在Android应用中是必不可少的组件,它为用户提供了一种方便的方式来搜索应用内的数据。通过监听`SearchView`事件、实现`Filterable`接口并更新`ListView`,我们可以实现一个完整的搜索功能。在实际开发中,可以根据需求进一步定制和优化`SearchView`的行为。
- 1
- 得按懂得按懂得2015-05-06代码比较简洁呀,参考还是可以参考一下的。
- xiongqian20112016-08-03代码比较简洁呀,参考还是可以参考一下的
- 薄荷加点糖20162016-07-28赞赞赞,大爱博主
- hheuii2017-09-20不错,值得学习~
- 粉丝: 14
- 资源: 98
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于hadoop的百度云盘源代码(亲测可用完整项目代码)
- CTF比赛工具合集-多种竞赛场景源码.zip
- 基于深度学习4j价格预测与语义分析源码+实战项目.zip
- Django+MySQL新冠疫情数据可视化平台源码+设计报告.zip
- 基于Django自动化测试管理系统python源码+设计报告(高分项目).zip
- Django高考志愿填报智能推荐系统python源码+设计论文(2024年毕业设计).zip
- Docker和Kubernetes构建的服务管理系统设计与实现 + 设计报告(Java版).zip
- DQN柔性作业车间调度-带插单的动态调度问题(含源码+项目说明+设计报告).zip
- ESP32-CAM+MicroPython+Flask智能Web视频监控与目标检测系统 + 设计报告.zip
- ESP8266墨水屏开发板项目(C++源码+硬件PCB资料+开发手册).zip
- Fisco Bcos支持的NFT数字藏品网站-交易不可篡改且可追溯溯源(含源码及论文资料).zip
- Facenet深度学习人脸识别系统(含源码+项目说明+亚洲人脸数据集+设计报告).zip
- FISCOBCOS匿名投票系统源码+设计报告及全部资料(Paillier加密).zip
- FPGA加速交通标志识别-卷积神经网络实现(含源码+项目说明+硬件设计).zip
- Flask框架YOLOv5检测训练源码+快速搭建手册.zip
- GAILC2024无人机双光检测Rank6源码+项目报告文档.zip