关于ListView中包含EditText数据复用引起异常的解决方案
概述
前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题。实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过。诸如,ListView嵌套EditText、CheckBox等焦点问题都会出现复用的错乱,其根源就是ViewHolder的复用问题。
 
说说上面的问题吧,保存item中EditText中的数据,导致数据复用的时候都给设置了值。我们在最外层存了一个Map
Map<Integer, String> edItem;监听每个Item的输入(OnTextChangedListener),并在afterTextChanged()将值保存到Map中去。
 holder.editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                if ((edItem.size() == inputContainer.size())) {
                    // 添加一项控件
                    edItem.put(edindex, "edindex");
                }
                return false;
            }
        });但是这里出现了一个问题,由于复用,导致,每一个Item都被赋值了,所以我们要解决这个问题得从源头阻断给EditText赋值,也就是在OnTextChange方法里面,我们判断一下,如果用户操作的是当前的Item,我们就给Map赋值,否则不赋值,或者赋值为空值。 
所以这个时候我们要对EditText的触摸事件做监听:
editText.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    index = position;
                }
                return false;
            }
        });然后我们在TextWatcher的onTextChanged判断一下:
public void onTextChanged(CharSequence text, int start, int before, int count) {
                //如果该edittext有默认内容,还要在if那里进行过滤
 if (index>=0 && text.length() > 0 &&index== position) {
      mData.get(index).put("input", text.toString());
                }
            }这样就解决了复用的问题,完整代码:
public class ListViewTestAdapter extends BaseAdapter {
    private List<Map<String, String>> mData;
    private LayoutInflater mInflater;
    private Context mContext;
    private int index = -1;
    public ListViewTestAdapter(Context context, List<Map<String, String>> data) {
        this.mContext = context;
        this.mData = data;
        this.mInflater = LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        return mData.size();
    }
    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = new ViewHolder();
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.main_function_listitem3, null);
            holder.title = (TextView) convertView.findViewById(R.id.txtTitle);
            holder.editText = (EditText) convertView.findViewById(R.id.input);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        EditText editText = holder.editText;
        editText.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    index = position;
                }
                return false;
            }
        });
        editText.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable editable) {
            }
            public void beforeTextChanged(CharSequence text, int start, int count, int after) {
            }
            public void onTextChanged(CharSequence text, int start, int before, int count) {
                //如果该edittext有默认内容,还要在if那里进行过滤
                if (index>=0 && text.length() > 0 && index == position ) {
                    mData.get(index).put("input", text.toString());
                }
            }
        });
        holder.title.setText(mData.get(position).get("title"));
        holder.editText.setText(mData.get(position).get("input"));
        editText.clearFocus();
        if (index != -1 && index == position) {
            editText.requestFocus();
        }
        final ViewHolder finalHolder = holder;
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, finalHolder.title.getText(), Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }
    public final class ViewHolder {
        public TextView title;
        public EditText editText;
    }
}关于ListView中包含EditText数据复用引起异常的解决方案的更多相关文章
- (转载)解决ListView中使用EditText所遇到的一些冲突
		大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ... 
- 判断DataTale中判断某个字段中包含某个数据
		// <summary> /// 判断DataTale中判断某个字段中包含某个数据 /// </summary> /// <param name="dt&quo ... 
- Fusion Tables 图层用于呈现 Google Fusion Tables 中包含的数据
		Google Maps API 允许您使用 FusionTablesLayer 对象将 Google Fusion Tables 中包含的数据呈现为地图上的图层.Google Fusion Table ... 
- ListView 中含有 EditText 导致焦点丢失的问题
		ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ... 
- 传输json数据到前台的时候,数据中包含日期数据
		问题描述 当从数据库中查询的数据中包含有日期格式的数据的时候,数据传输到前台会报错. 解决方式 // 逐条将日期进行格式化后再传输 Date date = new SimpleDateFormat(& ... 
- 关于ListView中notifyDataSetChanged()刷新数据不更新原因
		使用Listview的时候: 当要动态显示更改后的数据(例如数据库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的数据. 这时候就要注 ... 
- PHP中$_REQUEST中包含的数据,数据被覆盖问题
		这个问题涉及到php.ini中的两个变量. variables_order = "EGPCS" variables_order 系统在定义PHP预定义变量,EGPCS 是 Envi ... 
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十五)Structured Streaming:同一个topic中包含一组数据的多个部分,按照key它们拼接为一条记录(以及遇到的问题)。
		需求: 目前kafka的topic上有一批数据,这些数据被分配到9个不同的partition中(就是发布时key:{m1,m2,m3,m4...m9},value:{records items}),m ... 
- ListView中含有EditText时候--要命的焦点问题迎刃而解
		最近做项目的时候遇到了一个问题,就是在ListView的item上面含有一个EditText,要求是这样: 1当点击item的时候,item可以点击; 2当点击EditText的时候EditText也 ... 
随机推荐
- 几个APP开发的创意
			每年都有大量新APP进入市场,争夺消费者的关注.随着越来越多的APP进入主流,随着需求的变化和新技术的出现,一系列新的APP随之而来.那么目前有什么APP开发的好创意呢? 1.旅游指南APP 当你在一 ... 
- 前端性能监控系统 & 前端数据分析系统
			前端监控系统 目前已经上线,欢迎使用! 背景:应工作要求,需要整理出前端项目的报错信息,尝试过很多统计工具,如: 腾讯bugly.听云.OneApm.还有一个忘记名字的工具. 因为各种原因,如: 统计 ... 
- [SHOI 2011]双倍回文
			Description 题库链接 记一个字符串为 \(X\) ,它的倒置为 \(X^R\) .现在给你一个长度为 \(n\) 的字符串 \(S\) ,询问其最长的形同 \(XX^RXX^R\) 的子串 ... 
- [HNOI 2017]影魔
			Description 题库链接 给你一段长度为 \(n\) 的序列 \(K\) . \(m\) 组询问,每次给定左右端点 \(l,r\) .求出满足区间内下述贡献和. 如果一个区间的两个端点是这一个 ... 
- [SDOI 2008]沙拉公主的困惑
			Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ... 
- ●POJ 2007 Scrambled Polygon
			题链: http://poj.org/problem?id=2007 题解: 计算几何,极角排序 按样例来说,应该就是要把凸包上的i点按 第三像限-第四像限-第一像限-第二像限 的顺序输出. 按 叉积 ... 
- HDU2222 自动机(学习中)
			题目大意: 给你很多个单词,然后给你一篇文章,问给出的单词在文章中出现的次数. 解题思路: AC自动机入门题.需要注意的就是可能有重复单词 代码如下: #include<iostream> ... 
- poj 3335 Rotating Scoreboard(半平面交)
			Rotating Scoreboard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6420 Accepted: 25 ... 
- poj 1269 线段与线段相交
			Intersecting Lines Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13605 Accepted: 60 ... 
- hdu 2888 二维RMQ模板题
			Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ... 
