Android EditText搜索框动态过滤ListView数据实现
18 浏览量
更新于2024-08-28
收藏 147KB PDF 举报
"这篇教程介绍了如何在Android应用中实现根据EditText搜索框动态更新ListView显示数据的功能。"
在Android开发中,有时我们需要实现这样一个功能:用户在EditText搜索框中输入关键词时,ListView会实时根据输入内容过滤并显示匹配的数据。这个功能在很多应用中都非常常见,比如联系人搜索、应用市场搜索等。下面我们将详细讲解如何实现这个功能。
1. 创建布局文件
首先,我们需要创建一个XML布局文件,包含一个EditText和一个ListView。EditText将作为搜索框,ListView用于展示数据。可以设置EditText的属性,例如添加清除按钮,以便用户能够快速清空输入。布局文件中的代码可能如下:
```xml
<RelativeLayout>
<EditText
android:id="@+id/search_box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入关键词"
android:inputType="textVisiblePassword" />
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/search_box" />
</RelativeLayout>
```
2. 初始化数据集
接下来,我们需要创建一个数据集,通常使用ArrayList存储数据。数据集可以是自定义的对象列表,或者使用HashMap存储键值对。这里我们使用ArrayList<Map<String, Object>>,其中键可以是标题(title)和内容(text)。同时,我们还需要创建两个ArrayList分别存储标题和内容,以便后续处理。初始化代码如下:
```java
ArrayList<Map<String, Object>> mData = new ArrayList<>();
ArrayList<String> mListTitle = new ArrayList<>();
ArrayList<String> mListText = new ArrayList<>();
// 填充数据,例如:
mListTitle.add("这是个标题!");
mListText.add("这是个内容。2014.09.");
for (int i = 0; i < mListTitle.size(); i++) {
Map<String, Object> item = new HashMap<>();
item.put("title", mListTitle.get(i));
item.put("text", mListText.get(i));
mData.add(item);
}
```
3. 设置ListView的Adapter
创建一个SimpleAdapter或者自定义的Adapter,将数据集mData传入。SimpleAdapter的构造函数通常需要上下文、列表项布局、数据集、键列表和值列表。在这里,键列表可以是["title", "text"],值列表对应数据集中的键。
```java
SimpleAdapter adapter = new SimpleAdapter(
MainActivity.this, mData, R.layout.list_item,
new String[]{"title", "text"}, new int[]{R.id.title, R.id.text});
ListView mListView = findViewById(R.id.list_view);
mListView.setAdapter(adapter);
```
4. 监听EditText的文本变化
为了实现实时搜索功能,我们需要监听EditText的文本变化。可以使用TextWatcher接口,当用户输入时调用其方法。在afterTextChanged()方法中,我们可以对数据集进行过滤,并使用ListView的Adapter的`notifyDataSetChanged()`方法通知数据已更新:
```java
EditText searchBox = findViewById(R.id.search_box);
searchBox.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) {
String searchText = s.toString().trim();
if (searchText.isEmpty()) {
// 如果搜索框为空,显示所有数据
mData.clear();
mData.addAll(mOriginalData); // mOriginalData是原始未过滤的数据集
} else {
// 过滤数据
mData.clear();
for (Map<String, Object> item : mOriginalData) {
String title = (String) item.get("title");
String text = (String) item.get("text");
if (title.contains(searchText) || text.contains(searchText)) {
mData.add(item);
}
}
}
adapter.notifyDataSetChanged(); // 更新ListView
}
});
```
至此,我们就完成了根据EditText搜索框动态更新ListView显示数据的功能。当用户在搜索框中输入内容时,ListView会实时过滤并显示匹配的数据。这个功能提高了用户体验,使用户能够更快地找到所需信息。在实际开发中,还可以根据需求优化搜索算法,提高搜索效率。
2015-11-24 上传
2012-05-03 上传
2016-06-18 上传
点击了解资源详情
2023-09-12 上传
105 浏览量
2020-08-31 上传
176 浏览量
2017-04-01 上传
weixin_38612139
- 粉丝: 3
- 资源: 885
最新资源
- Haskell编写的C-Minus编译器针对TM架构实现
- 水电模拟工具HydroElectric开发使用Matlab
- Vue与antd结合的后台管理系统分模块打包技术解析
- 微信小游戏开发新框架:SFramework_LayaAir
- AFO算法与GA/PSO在多式联运路径优化中的应用研究
- MapleLeaflet:Ruby中构建Leaflet.js地图的简易工具
- FontForge安装包下载指南
- 个人博客系统开发:设计、安全与管理功能解析
- SmartWiki-AmazeUI风格:自定义Markdown Wiki系统
- USB虚拟串口驱动助力刻字机高效运行
- 加拿大早期种子投资通用条款清单详解
- SSM与Layui结合的汽车租赁系统
- 探索混沌与精英引导结合的鲸鱼优化算法
- Scala教程详解:代码实例与实践操作指南
- Rails 4.0+ 资产管道集成 Handlebars.js 实例解析
- Python实现Spark计算矩阵向量的余弦相似度