Android 如何在listView中保留checkedBox的状态?
在我的应用程序的列表视图中,我在每个listItem中都有一个复选框-Android 如何在listView中保留checkedBox的状态?,android,listview,checkbox,android-checkbox,Android,Listview,Checkbox,Android Checkbox,在我的应用程序的列表视图中,我在每个listItem中都有一个复选框- public class QuestionAdapter extends BaseAdapter { private Context context; private ArrayList<QuestionItem> questionItems; public QuestionAdapter(Context context, ArrayList<QuestionItem> questionIte
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;
}
公共类QuestionAdapter扩展了BaseAdapter{
私人语境;
私人ArrayList问题项;
公共QuestionAdapter(上下文上下文,ArrayList questionItems){
this.context=上下文;
this.questionItems=questionItems;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
MySQLiteHelper sqliteHelper=新的MySQLiteHelper(上下文);
QuestionViewHolder=null;
OnCheckedChangeListener mStarCheckedChanceChangeListener=新建OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
final String id=(String)buttonView.getTag();
Log.v(标签“isChecked is”+isChecked);
Log.v(标签,“id为”+id);
}
};
if(convertView==null){
LayoutInflater mInflater=(LayoutInflater)
context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
convertView=mInflater.充气(R.layout.question\u list\u项,空);
holder=新问题ViewHolder();
holder.qid=(TextView)convertView.findViewById(R.id.qid);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.star=(复选框)convertView.findViewById(R.id.btn_star);
convertView.setTag(支架);
}
否则{
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.setOnCheckedChangeListener(mStarCheckedChanceChangeListener);
}
否则{
holder.star.setOnCheckedChangeListener(null);
支架。星形。设置检查(假);
holder.star.setOnCheckedChangeListener(mStarCheckedChanceChangeListener);
}
//star.setChecked(false);
返回视图;
}
如果我手动选择并取消选择星号复选框的onCheckedChangeListener,它可以正常工作。但是如果我选择它并向下滚动listview,然后再次向上滚动,复选框的状态将从选中变为未选中
如何保留复选框的状态?如果我遗漏了一些非常琐碎或非常重要的内容,请告诉我。希望以下链接能够帮助您
在列表的每一项中,您都应该保留“isChecked”值,并且在getView方法中,您应该调用holder.
checkBox.setChecked(item.isChecked);
,并且您必须删除OnCheckedListener
的实现,而是实现OnClickListener
和“play”使用您的item.isChecked
值。(您应该删除OnCheckedListener的实现,因为每次执行holder.checkBox.setChecked(item.isChecked)
方法oncheckedInvoke
)只有一个解决方案。添加适配器标题,我将为您提供解决方案。@hasan83-适配器标题???@hasan83-已添加。这是您想要的吗?它说博客不存在。