我有一个奇怪的问题!我正在尝试使用复选框创建列表视图。在我的另一个thread我被告知我应该使用一个数组来跟踪被检查的行。我做到了,它工作得很好,但逻辑是错误的,我现在遇到另一个问题。
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;
}
}
});
}
首先取消选中所有复选框,它可以正常工作,即使我向下滚动并再次备份但保留了我选择的复选框,但未正确设置已检查的数组。基本上if测试应该是另一种方式!
if(isChecked)
{
rowLayout.setBackgroundColor(Color.GRAY);
checked[position] = true;
}
else
{
rowLayout.setBackgroundColor(Color.DKGRAY);
checked[position] = false;
}
问题在于滚动真的是因为每次我滚动onCheckedChanged方法都会被调用,并且因为它回收了它在新行的位置传递的行,它没有被选中,但是因为它与索引的行具有相同的索引。之前被选中它会改变它的价值。例如,如果我选中索引为2的方框(将其设置为true),然后向下滚动新行变为索引为2的行,则再次调用该方法并取消设置复选框(已检查数组中的字段)。
我需要它来“记住”所有被检查的盒子。换句话说,我希望正确初始化checked数组。并且还要记住每次滚动时检查哪些框并且不丢失它们!
我做错了什么?
你能帮帮我吗?
提前致谢 - 迈克
答案 0 :(得分:75)
这很棘手。
问题是您正在调用setChecked
,激活旧的OnCheckedChangeListener
。
修复非常简单:在致电setOnCheckedChangeListener
之前致电setChecked
。这样,您就可以从循环视图中切断与旧侦听器的链接。
答案 1 :(得分:0)
选中Checkbox
Listview
的单一选择
AdpList adapter=new AdpList(this,array,false);
listview.setAdapter(adapter);
当您选择任何项目时,请在项目CLickListener
上执行以下操作
listview.setonItemClickListener(new OnItemClickListener)
在这里,您将获得当前项目的位置
array.get(Position);
获取Checkbox视图,单击Checkbox,在Adapter中创建一个方法,比如
adapter.setList(true);
adapter.notifyDataSetChanged();
并在适配器中检查我在Setlist
方法中传递的参数
然后把条件:
if (isChecking==true)
{
checkbox1.setChecked(true);
}else{
checkBox1.setChecked(false);
}