今天做项目碰到一个BUG,一个listview中多个item,每个item中有两个EditText和一个Textview。item很多,Listview可以滑动。
当我在第一个Item中的EditText中输入文本后,来回拉动Listview,就会导致EditText中的值消失,或者到其他的EditText上。
查询之后发现是 Listview复用的问题 。网上的解决方案我试了很多,也许是我自己的问题,并没有根本解决问题。而且相当复杂。看了将近三十篇博文,都是差不多的解决方案。
今天给大家提供一种非常简单的解决方案。自己琢磨半天想到的。
思路:向下拉动ListView 会触发它的复用机制,每次都会调用getView。
这是切入点。所以我把每个Item(view)加入到一个 HashMap<Integer,View>中。
Integer对应的是item的position 。View对应的是ViewHolder 也就是你Item中的所有控件。
结合这些,看一下我的getview() 非常容易的就解决了问题
注意:一定是if(viewHashMap.get(position)==null)在put
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
//重点
if(viewHashMap.get(position)==null){
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_style_checkitem,
null);
viewHolder.tvCheckItem = (TextView) convertView.findViewById(R.id.tv_CheckItem);
viewHolder.etCheckTime = (EditText) convertView.findViewById(R.id.et_CheckTime);
viewHolder.etCheckData = (EditText) convertView.findViewById(R.id.et_CheckData);
viewHolder.etRemark = (EditText) convertView.findViewById(R.id.et_Remark);
viewHashMap.put(position,convertView);
convertView.setTag(viewHolder);
}else {
convertView = viewHashMap.get(position);
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.tvCheckItem.setText(mList.get(position));
return convertView;
}
我的item中只有一个TextView和两个EditText,所以我的ViewHolder
public final static class ViewHolder {
EditText etCheckTime,etCheckData,etRemark;
TextView tvCheckItem;
}