这是一篇文字超多的博客,哈哈哈,废话自行过滤···

  • 遇到问题

  在开发中我们常会在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的坑的更多相关文章

  1. 【 Android】自定义的AlertDialog中的EditText无法调用输入法问题解决

    1.问题描述: 在自定义的AlertDialog 中添加了EditText组件,但运行时怎么点EditText都无法调出软键盘: 2.原因分析: 一开始我以为EditText的focus属性没有设置好 ...

  2. ListView 中含有 EditText 导致焦点丢失的问题

    ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...

  3. (转载)解决ListView中使用EditText所遇到的一些冲突

    大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ...

  4. 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法

    Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...

  5. (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因

    摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ...

  6. Android 如何在 ListView 中更新 ProgressBar 进度

    =======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...

  7. Android中设定EditText的输入长度(转)

    如何限定Android的Text中的输入长度呢? 方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText         android:id ...

  8. Android中设定EditText的输入长度

    方法一:可以在layout xml中加上属性android:maxLength 比如: <EditText         android:id="@+id/editTextShow& ...

  9. 关于ListView中包含EditText数据复用引起异常的解决方案

    概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...

随机推荐

  1. Browser Security-基本概念

    URL格式: scheme://[login[:password]@](host_name|host_address)[:port][/hierarchical/path/to/resource[?s ...

  2. jquery的版本 纵多 , 各个版本的插件的融合 ,

    有些插件在哪些版本下没有 插件之间因为版本冲突 是得不偿失的事情

  3. nginx default setting

    # You may add here your# server {#    ...# }# statements for each of your virtual hosts to this file ...

  4. Java反射的常见用法

    反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...

  5. Zabbix添加SNMP自定义监控项OID出现“No Such Instance currently exists at this OID”

    原因:zabbix 是用snmpget来获取指定的OID数据,snmpwalk是遍历某个OID下的数据. 所以一定要用snmpget来验证某个OID是否正确. snmptranslate 获取的OID ...

  6. Future、Callback、Promise

    推荐下边两篇,写的很棒 https://juejin.im/post/5b126065e51d4506bd72b7cc https://www.cnkirito.moe/future-and-prom ...

  7. vue-particles做背景,鼠标动画粒子连线填坑(按钮没有点击响应)

    为了提高页面展示效果,登录界面内容比较单一的,粒子效果作为背景经常使用到,vue工程中利用vue-particles可以很简单的实现页面的粒子背景效果. 解决问题: 以背景方式显示 无法获取按钮焦点, ...

  8. 如何运行使用gradle打包的项目

    目标:https://github.com/davenkin/springmvc4-helloworld 使用SpringMVC编写的一个HelloWorld程序. 初学Gradle只能一步步摸索前进 ...

  9. List<E> 、Set<E>和Map<K,E>的简单应用

    题目一: 创建两个线性表,分别存储{“chen”,“wang”,“liu”,“zhang”}和{“chen”,“hu”,“zhang”},求这两个线性表的交集和并集. 代码: List_Test.ja ...

  10. shell命令之一天一见

    一.在统计行数时常要用的到命令包括 w.c.l, 在这里做个简单的介绍. 语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也 ...