如何在listView中保留checkBox的状态?

时间:2014-11-11 15:42:15

标签: android listview checkbox android-checkbox

在我的应用程序列表视图中,我在每个listItem中都有一个复选框。我在自定义BaseAdapter中使用此代码 -

public class QuestionAdapter extends BaseAdapter {

 private Context context;
 private ArrayList<QuestionItem> questionItems;
 public QuestionAdapter(Context context, ArrayList<QuestionItem> questionItems){
        this.context = context;
        this.questionItems = questionItems;
 }

        @Override
public View getView(int position, View convertView, ViewGroup parent) {

    MySQLiteHelper sqliteHelper = new MySQLiteHelper(context); 
    QuestionViewHolder holder = null;

     OnCheckedChangeListener mStarCheckedChanceChangeListener = new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                final String id = (String) buttonView.getTag();
                Log.v(TAG, "isChecked is " + isChecked);
                Log.v(TAG,"id is " + id);

            }
        };

    if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.question_list_item, null);

            holder = new QuestionViewHolder();

            holder.qid = (TextView) convertView.findViewById(R.id.qid);
            holder.title = (TextView) convertView.findViewById(R.id.title);

            holder.star = (CheckBox) convertView.findViewById(R.id.btn_star);

            convertView.setTag(holder);

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





        holder.qid.setText(questionItems.get(position).getQid());        
        holder.title.setText(questionItems.get(position).getTitle());


        holder.star.setTag(questionItems.get(position).getQid());
        if(sqliteHelper.questionexists(questionItems.get(position).getQid())){
            holder.star.setOnCheckedChangeListener(null);
            holder.star.setChecked(true);
            holder.star.setOnCheckedChangeListener(mStarCheckedChanceChangeListener);
        }
        else{
            holder.star.setOnCheckedChangeListener(null);
            holder.star.setChecked(false);
            holder.star.setOnCheckedChangeListener(mStarCheckedChanceChangeListener);
        }
        //star.setChecked(false);


        return convertView;
}

Star CheckBox的onCheckedChangeListener在手动选择和取消选择时工作正常。但是如果我选择它并向下滚动列表视图然后再向上滚动,则checkBox的状态从选中变为未选中。

如何保留复选框的状态?如果我遗漏了一些非常重要或非常重要的内容,请指出我。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

在列表的每个项目中,您应该保留“isChecked”值,并且在您的getView方法中,您应该调用holder。checkBox.setChecked(item.isChecked);,并且您必须删除OnCheckedListener的实现,而是实现{ {1}}并使用OnClickListener值“播放”。 (您应该删除OnCheckedListener的实现,因为每次item.isChecked方法holder.checkBox.setChecked(item.isChecked)