当笔记来用,也希望可以帮助和我有一样问题的人
开发listview时遇到这样一个问题,有一个listview列表需要在每一项中有一个edittext进行输入结果,最后将结果保存,输入后滚动时edittext的值会产生错乱,我用了item的重用。
代码片段如下:
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.et_name = (EditText)convertView.findViewById(R.id.item_name_et);
holder.et_result = (EditText)convertView.findViewById(R.id.item_result_et);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.setData(list.get(position),position);
return convertView;
}
private class ViewHolder{
EditText et_name;//名称
EditText et_result;//结果
void setData(final AddInfoBean bean, final int position){
et_result.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
list.get(position).setResult(arg0.toString());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {}
@Override
public void afterTextChanged(Editable arg0) {}
});
et_name.setText(bean.getName());
if(bean.getResult() != null || !"".equals(bean.getResult())){
et_result.setText(bean.getResult());
}else{
et_result.setText("");
}
}
}
最后经过讨论请教解决了问题:
解决方法是把方法setData(final AddInfoBean bean, final int position)中的参数放到外面,还有一个改进就是et_result的监听也放到外面,这样可以减少监听方法的创建。
我当时写的时候两个一起改了,然后问题就解决了,监听没放外面的情况没测试,大家可以测试一下,应该是没问题的。(出现这个问题的原因可能是setData方法的参数为final类型)
代码片段如下
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.et_name = (EditText)convertView.findViewById(R.id.item_name_et);
holder.et_result = (EditText)convertView.findViewById(R.id.item_result_et);
convertView.setTag(holder);
initListener();
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.setData(list.get(position),position);
return convertView;
}
private class ViewHolder{
EditText et_name;//名称
EditText et_result;//结果
AddInfoBean bean;
int position;
void initListener(){
et_result.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
list.get(position).setResult(arg0.toString());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {}
@Override
public void afterTextChanged(Editable arg0) {}
});
}
void setData(final AddInfoBean bean, final int position){
this.bean = bean;
this.position = position;
et_name.setText(bean.getName());
if(bean.getResult() != null || !"".equals(bean.getResult())){
et_result.setText(bean.getResult());
}else{
et_result.setText("");
}
}
}