ListView数据错位常见问题与解决方案
2018-03-16 17:33
274 查看
问题一:ListView中,复用机制导致EditView的输入数据错位?
解决方法:在Adapter调用getView时为EditView设置相应的值
1、默认清除所有EditView的焦点,即调用clearFocus()方法;holder.et.clearFocus();2、保存每个Item中EditView所对应的输入值,并在Adapter调用getView时进行setText()。holder.et.setText(mDatas.get(position).getContent());
问题二:在ListView中,EditView添加文本监听addTextChangeListener时,为EditView设置对应数据后会触发文本监听导致数据有误或无限触发?
解决方法:这与ListView的复用机制无关,是文本改变监听的使用不当导致的,只要在适当时候移除监听即可。
方法一:定义一个boolean变量做文本操作标志
1、在Adapter中定义一个boolean类型成员变量;private boolean mIsChange = false;2、为EditText设置对应数据即在setText()方法前将标志设为true,在setText()方法后将标志设为false;mIsChange = true;
holder.et.setText(mDatas.get(position).getContent());
mIsChange = false;3、在文本监听中判断标志不为true再做事情。ew TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
if (!mIsChange) {
// 做处理...
}
}方法二:适当移除监听
1、默认清除所有EditView的焦点,即调用clearFocus()方法;holder.et.clearFocus();2、单独new TextWatcher()对象;final TextWatcher tw1 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {}
}3、紧接在所有控件findViewById后为EditText添加焦点监听setOnFocusChangeListener,判断取得焦点时添加监听addTextChangeListener,失去焦点时移除监听removeTextChangedListener,这样只有我们在点击输入框即输入时进行监听输入情况;holder.et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
holder.et_curNum.addTextChangedListener(tw1);
} else {
holder.et_curNum.removeTextChangedListener(tw1);
}
}
});注:也可以直接设置完监听后,在为EditText设置对应数据前移除监听,设置完后添加监听。
还有就是无限触发文本改变监听的问题,主要是你在监听文本改变方法中调用setText()前没有先移除监听,在设置完再重新添加监听。@Override
public void afterTextChanged(Editable s) {
holder.et_addNum.removeTextChangedListener(this);
older.et.setText(mDatas.get(position).getContent());
holder.et_addNum.addTextChangedListener(this);
}
问题三:在ListView中,EditView添加文本监听addTextChangeListener时,更改数据notifyDataSetChaged()后,对EditText输入数据后,数据发生错位?
解决方法:当你在文本监听方法中输出getView传进来的position时,你会发现与你数据的位置对不上号,这是复用机制导致的,只要保存Item对应数据的position。
1、在getView中为控件设置值时用setTag()方法把position绑定给EditText;holder.et.setText(mDatas.get(position).getContent());
holder.et.setTag(position);2、在文本监听方法中不要使用geiView传进来的position值,而是使用我们绑定的position值。@Override
public void afterTextChanged(Editable s) {
int position = Integer.valueOf(holder.et_addNum.getTag().toString());
// 做处理...
}
解决方法:在Adapter调用getView时为EditView设置相应的值
1、默认清除所有EditView的焦点,即调用clearFocus()方法;holder.et.clearFocus();2、保存每个Item中EditView所对应的输入值,并在Adapter调用getView时进行setText()。holder.et.setText(mDatas.get(position).getContent());
问题二:在ListView中,EditView添加文本监听addTextChangeListener时,为EditView设置对应数据后会触发文本监听导致数据有误或无限触发?
解决方法:这与ListView的复用机制无关,是文本改变监听的使用不当导致的,只要在适当时候移除监听即可。
方法一:定义一个boolean变量做文本操作标志
1、在Adapter中定义一个boolean类型成员变量;private boolean mIsChange = false;2、为EditText设置对应数据即在setText()方法前将标志设为true,在setText()方法后将标志设为false;mIsChange = true;
holder.et.setText(mDatas.get(position).getContent());
mIsChange = false;3、在文本监听中判断标志不为true再做事情。ew TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
if (!mIsChange) {
// 做处理...
}
}方法二:适当移除监听
1、默认清除所有EditView的焦点,即调用clearFocus()方法;holder.et.clearFocus();2、单独new TextWatcher()对象;final TextWatcher tw1 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {}
}3、紧接在所有控件findViewById后为EditText添加焦点监听setOnFocusChangeListener,判断取得焦点时添加监听addTextChangeListener,失去焦点时移除监听removeTextChangedListener,这样只有我们在点击输入框即输入时进行监听输入情况;holder.et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
holder.et_curNum.addTextChangedListener(tw1);
} else {
holder.et_curNum.removeTextChangedListener(tw1);
}
}
});注:也可以直接设置完监听后,在为EditText设置对应数据前移除监听,设置完后添加监听。
还有就是无限触发文本改变监听的问题,主要是你在监听文本改变方法中调用setText()前没有先移除监听,在设置完再重新添加监听。@Override
public void afterTextChanged(Editable s) {
holder.et_addNum.removeTextChangedListener(this);
older.et.setText(mDatas.get(position).getContent());
holder.et_addNum.addTextChangedListener(this);
}
问题三:在ListView中,EditView添加文本监听addTextChangeListener时,更改数据notifyDataSetChaged()后,对EditText输入数据后,数据发生错位?
解决方法:当你在文本监听方法中输出getView传进来的position时,你会发现与你数据的位置对不上号,这是复用机制导致的,只要保存Item对应数据的position。
1、在getView中为控件设置值时用setTag()方法把position绑定给EditText;holder.et.setText(mDatas.get(position).getContent());
holder.et.setTag(position);2、在文本监听方法中不要使用geiView传进来的position值,而是使用我们绑定的position值。@Override
public void afterTextChanged(Editable s) {
int position = Integer.valueOf(holder.et_addNum.getTag().toString());
// 做处理...
}
相关文章推荐
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- 关于ListView显示数据,堆积问题的解决方案!!!
- ASP.NET2.0 GridView控件两大常见问题解决方案:自定义数据分页,类似DataGrid的VirtualItemCount功能
- 小细节折磨你-常见问题之数据求和为0 的解决方案
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- 常见对象_Scanner获取数据出现的小问题及解决方案
- 使用Jquery EasyUi常见问题解决方案 刷新 easyui datagrid 数据
- 关于 android listview 加载数据错位(错乱)问题
- redis常见重要性能指标数据分析和相关问题解决方案
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
- 两个ListView 嵌套数据出现错位,混淆的,图片闪烁问题
- 数据库间数据迁移常见问题解决方案整理
- listview嵌套gridview,数据错位问题
- 【坑爹系列】常见的图片排列错位问题-根源分析及解决方案
- ListView深入源码解析及其常见问题解决方案
- ListView选中后错位问题及解决方案(含单选和多选)
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案