ListVIew复用导致数据错乱

来源:互联网 发布:linux绑定域名命令 编辑:程序博客网 时间:2024/04/28 22:21

List View的复用相信大家都了解,使用convertView和ViewHolder,复用之后会大大提升性能,但在复用的同时可能会导致数据也被复用,一个典型的情况就是:在一个item上有一个checkBox,当你点击了item1上的checkBox,由于下面的某个item复用了这个item,所以导致这个item的checkBox也被勾选了,这就是典型的复用导致的数据错乱。
解决方法:
1.在使用convertView之前对这个convertView上面的状态进行清除,然后再根据业务逻辑进行对应的赋值。
2.将每个item与一个对象进行绑定,这个对象记录了这个item的状态。例如:
记录每个item状态信息的bean对象:

public class TagItemInfo {    private String tagContent;//tag内容    private Boolean isSelected;//是否选中    public String getTagContent() {        return tagContent;    }    public void setTagContent(String tagContent) {        this.tagContent = tagContent;    }    public Boolean getSelected() {        return isSelected;    }    public void setSelected(Boolean selected) {        isSelected = selected;    }    @Override    public String toString() {        return "TagItemInfo{" +                "tagContent='" + tagContent + '\'' +                ", isSelected=" + isSelected +                '}';    }}

2.getView:

    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        // View view = null;        mCheckedTags = new ArrayList<>();        final ViewHolder viewHolder ;        final TagItemInfo tagItemInfo = (TagItemInfo) getItem(position);        if (convertView == null) {            viewHolder = new ViewHolder();            convertView = View.inflate(mContext, R.layout.tag_list_item, null);            viewHolder.tagContent = (TextView) convertView.findViewById(R.id.tv_tag);            viewHolder.tagCB = (CheckBox) convertView.findViewById(R.id.cb_tag);            viewHolder.tagCB.setTag(tagItemInfo);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();            viewHolder.tagCB.setTag(tagItemInfo);//两个都是setTag        }        viewHolder.tagContent.setText(tagItemInfo.getTagContent());        viewHolder.tagCB.setChecked(tagItemInfo.getSelected());        //单选框的点击事件        viewHolder.tagCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                TagItemInfo info = (TagItemInfo) viewHolder.tagCB.getTag();                info.setSelected(buttonView.isChecked());            }        });

这样就完美的解决了复用导致的数据错乱问题。。。。。
参考文章:http://blog.csdn.net/huanongjingchao/article/details/42918869

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网上订酒店去后怎么办 澳洲语言班没过怎么办 照片粘在玻璃上怎么办 照片粘玻璃上怎么办啊 个人3月旅游签证怎么办 澳洲签证拒签了怎么办 我想买房子可是没钱怎么办 微信身份证17位怎么办 身份证后4位泄露怎么办 车牌照掉了一个怎么办 车牌螺丝孔坏了怎么办 借了贷款还不起怎么办 谷歌验证码丢了怎么办 谷歌验证码错误怎么办 未满16岁怎么办银行卡 身份证在北京丢了怎么办 出国前护照丢了怎么办 在美国护照丢了怎么办 护照上照片太丑怎么办 小额贷还不起了怎么办 护照不到6个月怎么办 出国的护照是怎么办的 快递被退回去了怎么办 枫叶卡过期9年怎么办? l签去台湾怎么办入台证 导游证考过了怎么办 在澳洲护照丢了怎么办 在韩国护照丢了怎么办 回国前护照丢了怎么办 在韩国护照掉了怎么办 在机场护照丢了怎么办 在泰国掉了护照,怎么办 在蘇梅护照丢了怎么办 护照不小心撕了怎么办 旧护照过期丢了怎么办 超跑遇到减速带怎么办 微信被盗用了怎么办 手机微信被盗号怎么办 身份证办了5张卡怎么办 贷款合同不给我怎么办 欠了手机贷的钱怎么办