Android 有关在ListView RecycleView 中使用EditText Checkbox的坑
这是一篇文字超多的博客,哈哈哈,废话自行过滤···
遇到问题
在开发中我们常会在ListView , RecycleView 列表中添加EditText输入框,或者checkbox复选框。

复选框应该是用的比较多的,输入框淘宝采用的是弹出框的方式,可能在一些特定的情况下,我们希望能够直接在列表中输入,可能会更方便些。
今天说的就是两个事件
CompoundButton.OnCheckedChangeListener
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
});
TextChangedListener
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
我们可能会在Adapter中使用这两个方法来监听选择Checkbox 和 EditText 的变化。
那么我们遇到的坑是?
CheckBox
假设我们我有一个全选按钮,理想效果是:列表全部选中,全选复选框也选中,如果取消其中一个全选复选框就不选中,如果选中全选,列表全选,如果取消全选,列表取消选中。如果列表全部选中,取消其中一个,然后就会设置全选为 不选中,那么就会触发全选复选框的checkedchange事件,如果全选从选中变为 未选中,列表全部设置未选中。
说了这么多,挺复杂的,略过···
然后你以为只是列表中的复选框和全选复选框的冲突···你就错了···实际上不只如此
总之,解决复选框的问题很简单,我们不用checkedchange事件,因为这个事件不仅在用户操作是触发,其他代码中的设置也会触发。直接使用 onclick 点击事件来控制checkbox 的选中和未选,一定要把选中未选的状态加到 数据列表中。解决以Myviewholder影响的选中错乱。
EditText
这个就厉害了,我竟不知道该用什么事件来代替 TextChangedListener ,由于viewholder减少了view的加载资源耗损,也就是意味着列表中的两个不是一次加载出来的条目可能使用的是同一个viewholder。
我试过用 焦点离开来做,这个在adapter刷新时还是有一些问题。
为什么 onclick 事件不会有问题?因为 onclick一定是用户触发的,而 TextChanged、onfocus都有可能是adapter刷新获取其他原因造成你并不想触发这个这个事件,没办法区分开是用户输入的还是程序造成的。
其实本来不想写博客的,checkbox其实入坑不是第一次了,很久没开发Android,我又入坑了。主要是 EditText 的问题。好吧我看过其他解决方式是将 TextWatcher 事件像 viewholder 一样储存起来,但我也并没有解决问题。
办法肯定是有的,比如和淘宝一样弹出输入框输入,或者当用户准备输入的时候右边显示一个小图标点击一下用来保存,有点像Web上面的,能想象是什么样子吗,哈哈哈。
解决方法
总之我觉得就是找一个能不被其他代码影响的事件来代替 TextChanged 以及 CheckedChange 事件。 比如 onclick ,其实我觉得 EditText 在 onfocus 事件上稍加处理可能可以,因为onfocus 的影响主要是在 Adapter 刷新的时候会改变,以及用户操作时会改变。
所以,我的终极解决方案:(忽略这个丑界面)

myViewHolder.et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b&&data.size()>position&&!myViewHolder.et.getText().toString().equals(data.get(position).getCheckValue()+"")) {
saveCheckValue(myViewHolder, position);//此方式实现将输入框数据填充到 data 数据集合中,无其他操作 即 data.get(position).setCheckValue(myViewHolder.et.getText().toString());
}
}
});
myViewHolder.et.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if (data.size()>position&&!myViewHolder.et.getText().toString().equals(data.get(position).getCheckValue()+"")) {
if (i == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP) {
saveCheckValue(myViewHolder, position);
}
}
return false;//返回 false 让此方法可进行其他操作,如,把光标切换到下一个输入框
}
});wujiaox
同时使用了onFocus 事件和 OnKey KEYCODE_ENTER回车事件来获取输入框中的值。
onFocus:()
①focus 有两种一种时获取焦点一种是失去焦点,我们取失去焦点。所以判断 !b
②由于操作中有新增一行,删除一行,当删除光标所在的行也会引发焦点失去的事件,此时postion的条目可能已经移出,所以判断 data.size()>position
Android 有关在ListView RecycleView 中使用EditText Checkbox的坑的更多相关文章
- 【 Android】自定义的AlertDialog中的EditText无法调用输入法问题解决
1.问题描述: 在自定义的AlertDialog 中添加了EditText组件,但运行时怎么点EditText都无法调出软键盘: 2.原因分析: 一开始我以为EditText的focus属性没有设置好 ...
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- (转载)解决ListView中使用EditText所遇到的一些冲突
大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ...
- 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...
- (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因
摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Android中设定EditText的输入长度(转)
如何限定Android的Text中的输入长度呢? 方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText android:id ...
- Android中设定EditText的输入长度
方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText android:id="@+id/editTextShow& ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
随机推荐
- 11、python模块的导入
前言:本文主要介绍python模块的导入,包括模块的定义.模块的作用.导入方式以及模块的搜索路径. 一.模块的定义 python模块(module),简单来说就是一个python文件,以.py结尾,文 ...
- 深入NodeJS模块os - 与操作系统“打交道”
读了 os 模块的文档,研究了几个有意思的问题:
- HttpApplication IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable ps url System.Web.dll
// 摘要: // 定义 ASP.NET 应用程序中的所有应用程序对象共有的方法.属性和事件.此类是用户在 Global.asax 文件中所定义的应用程序的基类. [Toolb ...
- QEMU和KVM的关系
首先KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器).在支持VMX(Virtual Machin ...
- 性能优于JDK代理,CGLib如何实现动态代理
按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建 ...
- vue报错Error in v-on handler: "RangeError: Maximum call stack size exceeded"
看下面的报错 错误 看到这个错误一脸懵逼.后面了解到,是因为程序进入了死循环,后面检查了我的代码,原来在这里自己调用自己
- 学过 C++ 的你,不得不知的这 10 条细节!
每日一句英语学习,每天进步一点点: “Action may not always bring happiness; but there is no happiness without action.” ...
- 二、Mongodb常用命令
#进入admin数据库 use admin #进行权限认证 db.auth('userAdmin', '123456') #查询所有用户 db.system.users.find() #更新用户 db ...
- Zabbix:主动模式
简介 Zabbix 是由 Alexei Vladishev 开发的一种网络监视.管理系统,基于 Server-Client 架构.可用于监视各种网络服务.服务器和网络机器等状态,官方站点:https: ...
- Spring Cloud第十四篇 | Api网关Zuul
本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...