如何在listView中保持checkBox的状态持久化

时间:2015-02-02 14:54:40

标签: android listview checkbox

我有一个包含11个项目的listview的片段,每个项目包含(TextView,checkbox和imageview)。

我面临的问题是,App。处于lanscape模式,当我选中任何复选框并滚动时,checkBox的检查状态不会持续存在,就好像它是 复位。

在下面的代码中是我试图保持checkBox的检查状态持久。

我还阅读了关于convertView的内容,简单地说明了我对它的理解,就好像listView滚动它并不保持其状态,它会在每个滚动条中创建视图的新对象。

发布的代码,不允许选中任何复选框,

请帮助我知道我缺少什么并解决这个问题。

getView()

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    final Viewholder holder;
    final CheckBoxstate[] cbState = new CheckBoxstate[getCount()];
    for (int i = 1; i <= getCount(); i++) {
        cbState[i-1] = new CheckBoxstate();
    }

    if (convertView == null) {
        holder = new Viewholder();

        LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = layoutinflater.inflate(R.layout.list_items_layout, null);

        holder.mTextView = (TextView) convertView.findViewById(R.id.tvlist_topic);
        holder.mCheckBox = (CheckBox) convertView.findViewById(R.id.cbList_hook);
        holder.mImageView = (ImageView) convertView.findViewById(R.id.ivList_delete);

        convertView.setTag(holder);

    } else {
        holder = (Viewholder) convertView.getTag();
    }

    if (this.checkedItemsList == null) {
        this.checkedItemsList = new ArrayList<String>();
    }

    holder.mTextView.setText(this.designList.get(position).getTopic());

    holder.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (isChecked) {
                cbState[position].setPosition(position);
                cbState[position].setState(true);
                holder.mCheckBox.setChecked(true);
                designList.get(position).setIsChecked(true);

                for (int i = 1; i <= getCount(); i++) {
                    if ( cbState[i-1].isChecked() ) {

                    } else {
                        holder.mCheckBox.setChecked(false);
                        designList.get(i-1).setIsChecked(false);
                    }
                }

            } else {

            }
        }
    });

    holder.mImageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (holder.mCheckBox.isChecked()) {
                holder.mCheckBox.setChecked(false);
                designList.get(position).setIsChecked(false);
            }
            designList.remove(position);
            notifyDataSetChanged();
        }
    });

    return convertView;
}

private class Viewholder {
    TextView mTextView;
    CheckBox mCheckBox;
    ImageView mImageView;
}

private class CheckBoxstate {
    private int pos;
    private boolean state;

    public CheckBoxstate() {
        // TODO Auto-generated constructor stub
    }
    public CheckBoxstate(int pos, boolean state) {
        // TODO Auto-generated constructor stub
        this.pos = pos;
        this.state = state;
    }

    public void setPosition(int pos) {
        this.pos = pos;
    }
    public int getPosition() {
        return this.pos;
    }

    public void setState(boolean state) {
        this.state = state;
    }
    public boolean isChecked() {
        return this.state;
    }
}

2 个答案:

答案 0 :(得分:1)

private ArrayList<YourModel> mYourModel;
private int[] mcheckedItemBB;

mcheckedItemBB = new int[(mYourModel.size())] ;


viewHolder.mBB = (CheckBox)v.findViewById(R.id.bbcheck);

v.setTag(viewHolder);
viewHolder.mBB.setOnCheckedChangeListener(BBCheckChangedList) ;

viewHolder.mBB.setTag(position) ;

if (mcheckedItemBB[position] == 1) {
            viewHolder.mBB.setChecked(true);
        }
        else {
            viewHolder.mBB.setChecked(false);
        }

CompoundButton.OnCheckedChangeListener BBCheckChangedList = new CompoundButton.OnCheckedChangeListener()
    {
        public void  onCheckedChanged(CompoundButton buttonView,
        boolean isChecked) {
            int position = (Integer) buttonView.getTag() ;
            if (isChecked)
                mcheckedItemBB[position] = 1  ;
            else
                mcheckedItemBB[position] = 0  ;

        }

    } ;

答案 1 :(得分:0)

数据!=其视觉表现

getView事件仅请求您提供适配器中包含的数据的直观表示。因此,无论发生什么变化,您都必须在适配器/底层List中反映它们,因为当它们滚出屏幕时,视图本身会被立即销毁/重用。

然后,在getView中创建/重新使用视图时,从列表中读取当前复选框状态并相应地选中复选框。

这是position调用中getView参数所代表的内容:您可以使用List找到基础数据。