Adapter类型控件之ListView的checkbox错位问题解决方法

*(一)概述
Adapter类型控件之ListView的checkbox错位问题解决方法_第1张图片
(二)导致ListView的checkbox错位的原因
网上找来的一幅关于ListView getView方法调用机制的一个图片:
Adapter类型控件之ListView的checkbox错位问题解决方法_第2张图片
Adapter类型控件之ListView的checkbox错位问题解决方法_第3张图片
Adapter类型控件之ListView的checkbox错位问题解决方法_第4张图片

从图中看出,Postion从12开始,ConvertView就不为空了,具体这里代表的是什么, 我也不知道,我们知道这里ConvertView会缓存就好,就是因为这个原因 造成的checkbox错位,所以第一个解决方式就是,不重用这个ConvertView,或者 说每次getView都将这个ConvertView设置为null,但是如果需要显示的Item数目巨大的话, 这种方法就会显得非常臃肿,一般实际开发我们使用的是下面的解决方法:
找个东东来保存当前Item CheckBox的状态,初始化的时候进行判断,设置是否选中!
2.解决方法示例:
好的存储这个Checkbox的方法有很多,你可以放到一个HashMap中,
每次初始化的时候根据postion取出对应的boolean值,然后再进行checkbox的状态设
置;
而笔者的做法则是在entity类中加入了一个boolean值用于判断,下面是笔者一个项目中
抽取出来的代码,代码比较简单,相信你看完会秒懂的~
Entity类:Person.java

Entity类:Person.java:
public class Person implements Serializable{
    private String name;
    private String number;
    private boolean checkStatus;

    public Person(String name, String number) {
        super();
        this.name = name;
        this.number = number;
        this.checkStatus = false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {22.          return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
    public boolean getCheckStatus() {
        return checkStatus;
    }

    public void setCheckStatus(boolean checkStatus) {
        this.checkStatus = checkStatus;
    }
}

实现的Adapter类:ContactListAdapter.java:
public class ContactListAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener{

    private List<Person> mData;
    private Context mContext;

    public ContactListAdapter(List<Person> data, Context context) {
        mData = data;
        mContext = context;
    }

    // 定义一个刷新数据的方法
    public void changeData(List<Person> data) {
        mData = data;
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Person getItem(int position) {
        return mData.get(position);25.      }

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup 
            parent) {
        final Person person = mData.get(position);
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.item_contact, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.ly = (RelativeLayout) convertView
                    .findViewById(R.id.lyContactListItem);
            viewHolder.txtName = (TextView) convertView
                    .findViewById(R.id.txtName);
            viewHolder.txtNumber = (TextView) convertView
                    .findViewById(R.id.txtNumber);
            viewHolder.cbxStatus = (CheckBox) convertView
                    .findViewById(R.id.cbxStatus);
            convertView.setTag(viewHolder);
            viewHolder.cbxStatus.setTag(person);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.cbxStatus.setOnCheckedChangeListener(this);
        viewHolder.cbxStatus.setChecked(person.getcheckStatus());
        viewHolder.txtName.setText(person.getName());
        viewHolder.txtNumber.setText(person.getNumber());
        return convertView;
    }
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean 
            isChecked) {
        Person person = (Person)buttonView.getTag();
        person.setCheckStatus(isChecked);
    }

    private class ViewHolder {
        RelativeLayout ly;
        TextView txtName;
        TextView txtNumber;
        CheckBox cbxStatus;
    }
}

这里写图片描述

你可能感兴趣的:(ListView,checkbox,控件,错位问题)