Android的listview与checkbox的问题

我有一个奇怪的问题! 我正在尝试创build一个与checkbox的列表视图。 在我的另一个线程中,我被告知应该使用一个数组来跟踪被检查的行。 我这样做,它运作良好,但逻辑是错误的,现在我遇到了另一个问题。

public View getView(final int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox); checkbox.setChecked(checked[position]); final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow); checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { rowLayout.setBackgroundColor(Color.GRAY); checked[position] = false; } else { rowLayout.setBackgroundColor(Color.DKGRAY); checked[position] = true; } } }); } 

所有的checkbox最初没有选中它可以正常工作,它保留了我选中的那些,即使我向下滚动并重新备份,但检查的数组设置不正确。 基本上,如果testing应该是另一种方式!

 if(isChecked) { rowLayout.setBackgroundColor(Color.GRAY); checked[position] = true; } else { rowLayout.setBackgroundColor(Color.DKGRAY); checked[position] = false; } 

问题是滚动的真正原因是因为每次我滚动onCheckedChanged方法被调用,并且因为它的循环行,它通过新行的位置,它没有被选中,但是因为它具有与先前select的相同的索引它改变了它的价值。 例如,如果我检查索引2(设置为true)的框,然后向下滚动一个新行成为索引为2的行,该方法被再次调用,并取消设置checkbox(检查数组中的字段)。

我需要它“记住”所有被检查的方框。 换句话说,我想要检查arrays被正确初始化。 而且要记住哪些盒子被检查,而不是每次滚动时都丢失它们!

我究竟做错了什么?

你能帮我么?

在此先感谢 – 迈克

Solutions Collecting From Web of "Android的listview与checkbox的问题"

这很棘手。

问题是你正在调用setChecked ,激活旧的OnCheckedChangeListener

修复很简单:在调用setChecked之前调用setOnCheckedChangeListener 。 通过这种方式,您可以从再循环视图切断旧监听器的链接。

Listview单击Checkbox选中此项

 AdpList adapter=new AdpList(this,array,false); listview.setAdapter(adapter); 

当你select任何项目,然后在项目CLickListener做如下

 listview.setonItemClickListener(new OnItemClickListener) 

在这里您将获得当前项目的位置

 array.get(Position); 

获取checkbox视图并单击checkbox,在Adapter,Like中创build一个方法

 adapter.setList(true); adapter.notifyDataSetChanged(); 

并在适配器中检查Setlist方法中已通过的参数,然后将条件:

 if (isChecking==true) { checkbox1.setChecked(true); }else{ checkBox1.setChecked(false); }