ListView中嵌入一个或多个EditText导致数据混乱解决方法
2015-01-04 15:17
465 查看
[vio.wang 崇尚开源 尊重原创] 转载请声明出处./article/1830427.html
关于ListView嵌入一个或多个EditText导致数据混乱,一直是个一个老生常谈的问题.在开发过程中常遇见,在各个网站上都没有一个很好的解决方法.动态添加view不失为一种方法[此处不详谈,自行百度].但是数据量大的话,就显得过于繁琐,且效率低,无法回收,对内存资源也过于浪费.以下方法说起来也简单,一看就明白.
在这里,我发一下自己的见解,或许浅薄,诸君见谅.抛砖引玉,博各位大神一言.
关于ListView嵌入多个EditText导致数据混乱的原因探讨:
在EditView源码中,我们不难发现EditText是继承于TextView,默认赋予了EditText焦点.而在ListView的源码中,我们会发现google对ListView进行了一番优化,当ListView的item滚出屏幕时,item会被回收掉.那么问题来了,学挖...咳,我们在重新利用item的时候,由于我们在ListView上嵌了EditText,EditText的焦点并不会随着item被回收系统回收掉.(Google挖坑啊),那么这个item上的EditView就会被赋予焦点,那么我们的数据该放在哪儿呢?一滑数据就会乱掉.
解决方法:自定义EditView继承自EditText
接下来,我们只需要与一般的自定义View一样在xml中用CLEditText替代EditText.
最后.在代码中,我们在ListView的Adapter的getView中,按如下操作即可.
关于ListView嵌入一个或多个EditText导致数据混乱,一直是个一个老生常谈的问题.在开发过程中常遇见,在各个网站上都没有一个很好的解决方法.动态添加view不失为一种方法[此处不详谈,自行百度].但是数据量大的话,就显得过于繁琐,且效率低,无法回收,对内存资源也过于浪费.以下方法说起来也简单,一看就明白.
在这里,我发一下自己的见解,或许浅薄,诸君见谅.抛砖引玉,博各位大神一言.
关于ListView嵌入多个EditText导致数据混乱的原因探讨:
在EditView源码中,我们不难发现EditText是继承于TextView,默认赋予了EditText焦点.而在ListView的源码中,我们会发现google对ListView进行了一番优化,当ListView的item滚出屏幕时,item会被回收掉.那么问题来了,学挖...咳,我们在重新利用item的时候,由于我们在ListView上嵌了EditText,EditText的焦点并不会随着item被回收系统回收掉.(Google挖坑啊),那么这个item上的EditView就会被赋予焦点,那么我们的数据该放在哪儿呢?一滑数据就会乱掉.
解决方法:自定义EditView继承自EditText
public class CLEditText extends EditText { private ArrayList<TextWatcher> mListeners = null; public CLEditText(Context ctx) { super(ctx); } public CLEditText(Context ctx, AttributeSet attrs) { super(ctx, attrs); } public CLEditText(Context ctx, AttributeSet attrs, int defStyle) { super(ctx, attrs, defStyle); } @Override public void addTextChangedListener(TextWatcher watcher) { if (mListeners == null) { mListeners = new ArrayList<TextWatcher>(); } mListeners.add(watcher); super.addTextChangedListener(watcher); } @Override public void removeTextChangedListener(TextWatcher watcher) { if (mListeners != null) { int i = mListeners.indexOf(watcher); if (i >= 0) { mListeners.remove(i); } } super.removeTextChangedListener(watcher); } public void clearTextChangedListeners() { if (mListeners != null) { for (TextWatcher watcher : mListeners) { super.removeTextChangedListener(watcher); } mListeners.clear(); mListeners = null; } } }看到这段代码,应该就明白个大概了.(如果没看明白也不用急),addTextChangedListener,removeTextChangedListener这两个方法是哪来的呢???一路ctrl左键,你就会发现这是出自TextView,没错,EditText就是继承自TextView.下面重点:clearTextChangedListeners这个方法才是重点.我们在这里做的就是清除所有获取到的TextWatcher.
接下来,我们只需要与一般的自定义View一样在xml中用CLEditText替代EditText.
最后.在代码中,我们在ListView的Adapter的getView中,按如下操作即可.
ViewHodler hodler = null; if (convertView == null) { convertView = layoutInflater.inflate( R.layout.in_list_ch, null); hodler = new ViewHodler(); hodler.s = (TextView) convertView .findViewById(R.id.tv_sk); convertView.setTag(hodler); } else { hodler = (ViewHodler) convertView.getTag(); holder.s.clearTextChangedListeners(); }ok,多个EditText同样操作,如有更好建议,请留言.
相关文章推荐
- Android 解决在ListView历史复用中Edittext数据显示混乱
- 关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法
- Android RecyclerView 中多Item的EditText焦点混乱,数据错乱的解决方法(更新)
- Android 解决在ListView历史复用中Edittext数据显示混乱
- Android中解决在ListView历史复用中Edittext数据显示混乱
- Android 解决在ListView历史复用中Edittext数据显示混乱
- 二、Android 解决在ListView历史复用中Edittext数据显示混乱
- 解决ListView中包含EditText数据混乱原理
- Android 解决ListView里面多套布局多个EditText数据混乱问题
- 布局中上面一个子布局,中间一个listview,下面一个edittext,解决edittext点击后输入法遮盖布局的问题
- ListView里如果有EditText,Edittext的值修改后,会触发其他的item里EditText的addTextChangedListener,导致数据重复
- listView中放入EditText滑动listView时,EditText中数据混乱解决方案
- Android 解决ListView中有EditText时,数据丢失问题
- ListView的Intent跳转详情页, 滑动与点击Position错乱导致数据混乱问题解决
- Android 中listView数据混乱的原因以及解决方法
- ListView中CheckBox和EditText重用问题解决方法
- 关于ScrollView嵌入ListView,或ListView嵌入ListView,导致里层的ListView无法滑动解决方法。
- 解决mx:AdvancedDataGrid表格中向上滚动导致数据混乱的非主流方法
- 解决在listview中重用viewholder导致数据混乱的问题
- 关于ListView中存在两个EditText焦点的解决方法