解决Android ListView滑动时Edittext监听器异常触发的问题
需积分: 45 21 浏览量
更新于2024-09-09
收藏 24KB DOCX 举报
"ListView滑动会触发addTextChangedListener"
在Android开发中,ListView是常见的用于展示大量数据的组件,而EditText则是用户输入文字的控件。当在一个ListView的每一项(item)中放置一个EditText,并为其添加addTextChangedListener来监听文本变化时,可能会遇到一些问题。标题和描述所提及的现象就是这种问题的一个典型实例。
问题描述:
当用户在ListView的某一项EditText中输入文字并滚动ListView时,addTextChangedListener会被多次触发,导致所有包含EditText的item内容被错误地同步。这是因为ListView在滚动时会复用item视图(view holder),而如果没有正确处理,监听器会持续响应之前item的状态,进而影响到其他item的显示。
解决办法:
1. 在自定义Adapter中,我们需要创建一个布尔变量,例如`isChange`,用来标记当前EditText的文字是否由用户手动改变。初始状态设为`true`,表示使用原始数据。
2. 在创建ViewHolder并初始化视图时,将监听器addTextChangedListener添加到EditText。在监听事件内部,首先检查`isChange`的值。如果`isChange`为`true`,则不执行任何操作,防止误触;如果为`false`,则进行后续处理,比如更新数据。
3. 在设置EditText的文本`setText`之前,将`isChange`设为`true`,表示接下来的文本设置是由程序触发的。在`setText`之后,将`isChange`设回`false`,表示文本已经更新完成,可以响应用户的输入。
以下是实现这个逻辑的伪代码:
```java
class MyAdapter extends BaseAdapter {
private boolean isChange = true; // 初始化标识符
@Override
public View getView(int position, View convertView, ViewGroup parent) {
OrderChanPin orderChanPin = mList.get(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.commit_item, null);
holder.product_name = (TextView) convertView.findViewById(R.id.product_name);
holder.product_pic = (ImageView) convertView.findViewById(R.id.product_pic);
holder.product_ext = (EditText) convertView.findViewById(R.id.product_ext);
// 添加监听器
holder.product_ext.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) {
if (!isChange) {
// 进行实际的数据更新和处理
}
}
@Override
public void afterTextChanged(Editable s) {}
});
} else {
holder = (ViewHolder) convertView.getTag();
}
// 设置文本前,更改isChange标志
isChange = true;
holder.product_ext.setText(orderChanPin.getText());
// 设置文本后,恢复isChange标志
isChange = false;
return convertView;
}
}
```
通过以上步骤,可以避免ListView滚动时addTextChangedListener的误触发,确保每个item的EditText只响应自己的文本变化,从而解决列表滚动时数据混乱的问题。这种方法是优化ListView性能的一种常见策略,能够有效避免因不当处理导致的用户体验问题。
2017-12-15 上传
2020-08-28 上传
2014-08-02 上传
141 浏览量
幽灵大神
- 粉丝: 12
- 资源: 29
最新资源
- StarModAPI: StarMade 模组开发的Java API工具包
- PHP疫情上报管理系统开发与数据库实现详解
- 中秋节特献:明月祝福Flash动画素材
- Java GUI界面RPi-kee_Pilot:RPi-kee专用控制工具
- 电脑端APK信息提取工具APK Messenger功能介绍
- 探索矩阵连乘算法在C++中的应用
- Airflow教程:入门到工作流程创建
- MIP在Matlab中实现黑白图像处理的开源解决方案
- 图像切割感知分组框架:Matlab中的PG-framework实现
- 计算机科学中的经典算法与应用场景解析
- MiniZinc 编译器:高效解决离散优化问题
- MATLAB工具用于测量静态接触角的开源代码解析
- Python网络服务器项目合作指南
- 使用Matlab实现基础水族馆鱼类跟踪的代码解析
- vagga:基于Rust的用户空间容器化开发工具
- PPAP: 多语言支持的PHP邮政地址解析器项目