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

  • 遇到问题

  在开发中我们常会在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. 美食家App开发日记4

    研究了卡片式布局中的Recyclerview的用法,但是调试了很长时间,导入包总是有问题,一到手机上运行就会闪退.还是在网上查了很多方法,很不开心我还是解决不了.

  2. 【原创】(一)Linux进程调度器-基础

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  3. JDBC详细说明+使用

    JDBC详解 一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提 ...

  4. 虚拟机ubuntu系统怎么添加 VMware tools

    首先弹出光盘 然后安装 点击安装VMware tools 然后进入光盘 打开VMware tools 文件夹 将解压文件拉到桌面上 打开桌面上的文件夹 不选中文件 然后键入下面的内容 输入密码 输入y ...

  5. Java 架构知识点整理

    架构学习 1. Java 核心技术 1.1. 基础知识 1.1.1. 进制转换 1.1.2. 异常处理 1.1.3. List 分批代码 1.1.4. 字符串分割 1.1.5. 编码风格 1.2. 并 ...

  6. 如何快速搭建一个 Node.JS 项目并进入开发?

    了解:如何快速搭建一个项目并进入开发? 在此不概述 Node.JS 的历史以及发展过程. 因为之前接触过通过 Java 开发语言,所以明确地知道一个服务器所需的文件,以及一个服务器所需要的操作. 那么 ...

  7. 《 Java 编程思想》CH05 初始化与清理

    < Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...

  8. Eclipse中文语言包安装和设置中文

    对于英语水平不好或者初学者来说使用中文开发环境可以有效提高学习效率,便于快速的学习和上手,不过对于当前的技术环境学习英语还是非常有必要的,当对Eclipse掌握到一定程度还是应该多使用英语环境来开发, ...

  9. spring mvc框架入门

    目录 1.web框架分层 2.什么是springmvc 3.springmvc的优势 4.springmvc和struct的区别 (spring mvc框架入门 1.web框架分层 一般web框架可以 ...

  10. BZOJ 1025 [SCOI2009]游戏 (DP+分解质因子)

    题意: 若$a_1+a_2+\cdots+a_h=n$(任意h<=n),求$lcm(a_i)$的种类数 思路: 设$lcm(a_i)=x$, 由唯一分解定理,$x=p_1^{m_1}+p_2^{ ...