最近项目中某功能需要ListView嵌套EditText来实现,使用过程中遇到一些问题:

1、点击弹出编辑框,edittext会失去焦点。

 解决焦点丢失的问题 
解决思路:软键盘弹出的时候会重新绘制界面,因此ListView进行了一次重新绘制,重新走了一边getView方法,生成了一个新的EditText,而之前展示光标的EditText被销毁,所以才造成了EditText的焦点丢失。既然焦点丢失是因为ListView的重绘导致的,那我们就可以定义一个变量mTouchItemPosition来记录用户触碰的EditText的位置,然后在getView方法中去判断当前的position是否和用户触碰的位置相等,如果相等则让其获得焦点,否则清除焦点。而mTouchItemPosition的值可以在EditText的OnTouch事件中获取。

mTouchItemPosition = -1;
holder.et_buyer_words.setTag(position);
if (mTouchItemPosition == position) {
holder.et_buyer_words.requestFocus();
holder.et_buyer_words.setSelection(holder.et_buyer_words.getText().length());
} else {
holder.et_buyer_words.clearFocus();
}
holder.et_buyer_words.setOnTouchListener(new View.OnTouchListener() { @Override
public boolean onTouch(View view, MotionEvent event) {
//注意,此处必须使用getTag的方式,不能将position定义为final
mTouchItemPosition = (Integer) view.getTag();
return false;
}
});

2、输入内容后,向下滑动因为listview的item重用机制,在上面输入的内容下面的item也会显示;向下滑动再拉回来原来的数据消失。

添加保存数据的功能 

  首先需要拿到EditText变化之后的数据,然后将这些数据替换掉之前的就可以了。

由于TextWatcher的afterTextChanged方法中获取不到当前position,所以我们需要新建一个内部类MyTextWatcher实现TextWatcher接口并持有一个position,其次在ViewHolder中需要持有一个MyTextWatcher的引用来动态更新其position的值,以下为完整代码:

      //留言 listview+edittext完美解决
mTouchItemPosition = -1;
holder.updateCartBean(cartBean);
holder.et_buyer_words.setText(cartBean.getMemo());
holder.et_buyer_words.setTag(position);
holder.et_buyer_words.addTextChangedListener(holder.mTextWatcher);
if (mTouchItemPosition == position) {
holder.et_buyer_words.requestFocus();
holder.et_buyer_words.setSelection(holder.et_buyer_words.getText().length());
} else {
holder.et_buyer_words.clearFocus();
}
holder.et_buyer_words.setOnTouchListener(new View.OnTouchListener() { @Override
public boolean onTouch(View view, MotionEvent event) {
//注意,此处必须使用getTag的方式,不能将position定义为final
mTouchItemPosition = (Integer) view.getTag();
return false;
}
});
    class ViewHolder{
MyTextWatcher mTextWatcher; public void updateCartBean(ShoppingCartListBean cartListBean) {
mTextWatcher.setCartBean(cartListBean);
}
} class MyTextWatcher implements TextWatcher {
private ShoppingCartListBean cartBean; public void setCartBean(ShoppingCartListBean cartBean) {
this.cartBean = cartBean;
} @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override
public void afterTextChanged(Editable s) {
cartBean.setMemo(s.toString());
}
}

总结:ListView嵌套过程中,因为复用机制还是会出很多问题的。查资料说RecycleView可以解决EditText焦点错乱问题,但基于项目整个架子都是ListView为底,没办法替换。所以以上是我的解决办法啦。

By LiYing

ListView+EditText使用遇到的坑的更多相关文章

  1. ListView EditText 实现的三种方式

    原文网址:http://blog.sina.com.cn/s/blog_682139d001013omd.html 这段时间搞一个android表格,真是搞死人,让我想到iphone开发是何其的简单啊 ...

  2. Android Listview

    方法一: xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  3. 下拉选择框加listview删除

    package com.downselect; import java.util.ArrayList; import android.R.array; import android.app.Activ ...

  4. datetimepicker一个不错的日历android特效

    datetimepicker一个不错的日历效,选中和选择日历效果都很不错, 实用的时候直接可以把datetimepicker-library这个引入到项目,调用的地方在实现 TimePickerDia ...

  5. 在 React Native 中使用 Redux 架构

    前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也 ...

  6. PopupWindow简单使用

    如图是效果图 当点击 “点我”的按钮是   会弹出 如图的 弹窗 补充为PopupWindow设置一个显示动画和消失的动画 先在anim的文件下分别设置显示和消失的动画 <?xml versio ...

  7. Android 有关在ListView RecycleView 中使用EditText Checkbox的坑

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

  8. ListView中含有EditText时候--要命的焦点问题迎刃而解

    最近做项目的时候遇到了一个问题,就是在ListView的item上面含有一个EditText,要求是这样: 1当点击item的时候,item可以点击; 2当点击EditText的时候EditText也 ...

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

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

随机推荐

  1. 安全和加密——openssl及自建CA

    一.对称加密算法 对称加密:加密和解密使用共用一个秘钥 特点 加密.解密使用同一个秘钥,效率高: 将原始数据分割成固定大小的块,逐个进行加密 缺点 密钥过多,密钥需要分发 数据来源无法确认 1. 使用 ...

  2. Robot Framework user guide

    http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html

  3. opencv和numpy的安装

    近日,学姐让我们切割图片,查了一下资料,发现我需要安装opencv和numpy.但是在安装过程中却出现了很多小问题,我在此结合自和自己的安装经验和网上查找的资料,做一个笔记. 1.opencv的安装 ...

  4. Python 简单购物程序

    # Author:Eric Zhao# -*- coding:utf-8 -*-'''需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就 ...

  5. python numpy复制array

    numpy快速复制array 前段时间想到一个算法,需要实现array的自我复制,直接上代码,两种复制方式, 整体复制 a=[[10,10,50,50],[10,10,40,50]] np.tile( ...

  6. 转载:使用Pandas进行数据匹配

    使用Pandas进行数据匹配 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas进行数据匹配 目录 merge()介绍 inner模式匹配 lefg模式匹配 right模式匹配 outer模式 ...

  7. 实践自己的WebSite______流水

    尝试从头至尾搭建一个MVC的网站,主要以流水的方式进行进度和记录,而不讨论技术的部分. 1,在Controller下创建两个文件夹,分别为sys和Business,分别对应于系统功能和业务逻辑.比如登 ...

  8. Linux学习-进程管理

    为什么进程管理这么重要呢? 这是因为: 首先,我们在操作系统时的各项工作其实都是经过某个 PID 来达成的 (包括你的 bash 环境), 因此,能不能进行某项工作,就与该进程的权限有关了. 再来,如 ...

  9. selenium2自动处理验证码

    最近在研究web自动化,登录时发现要输入验证码,之前在做手机app自动化时,就被验证码block了.这次做web时又遇到了,探索之后,发现有如下几个解决办法: 1.联系开发人员,让其帮忙在测试环境中注 ...

  10. python socket相关

    套接字的工作流程(基于TCP和 UDP两个协议) TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信( ...