带有复选框问题的Android列表视图

Posted

技术标签:

【中文标题】带有复选框问题的Android列表视图【英文标题】:Android listview with checkbox problem 【发布时间】:2011-07-23 14:16:58 【问题描述】:

我有一个奇怪的问题!我正在尝试创建一个带有复选框的列表视图。在我的另一个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 的行,则再次调用该方法并取消设置复选框(选中数组中的字段)。

我需要它来“记住”所有选中的框。换句话说,我希望正确初始化检查的数组。还要记住选中了哪些框,并且每次滚动时都不会丢失它们!

我做错了什么?

你能帮帮我吗?

提前致谢 -- 迈克

【问题讨论】:

嘿mixkat 能详细说明一下数组的使用吗? 你能显示你填充布尔数组的位置吗??? 遇到了同样的问题,但改用了 switch,但没想到解决方案这么简单 【参考方案1】:

这很棘手。

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

解决方法很简单:在调用setChecked 之前调用setOnCheckedChangeListener。这样你就可以从回收的视图中切断到旧监听器的链接。

【讨论】:

你让我大吃一惊!那确实解决了它!我不可能看到那个!谢谢! 是的,我没有意识到setChecked 会触发OnCheckedChangeListener。吸取教训! 如果您愿意,也可以看看 Vikas 的回答!它工作得很好!就“逻辑”或“事件流”而言,它实际上更容易! 我想了一会儿,但一开始并没有尝试自己,并且不必要地浪费了几个小时,直到我在这里读到它确实有效!所以点赞 请发布您的示例代码,对不起,我不知道如何解决这个问题【参考方案2】:

选中此项以在Listview 中选择Checkbox

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

当您选择任何项目时,然后在项目CLickListener 上执行以下操作

listview.setonItemClickListener(new OnItemClickListener)

在这里你会得到当前项目的位置

array.get(Position);

获取复选框视图并单击复选框,在适配器中创建一个方法,例如

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

然后在适配器中检查我在Setlist 方法中传递的参数 然后输入条件:

if (isChecking==true)

checkbox1.setChecked(true);
else
checkBox1.setChecked(false);

【讨论】:

以上是关于带有复选框问题的Android列表视图的主要内容,如果未能解决你的问题,请参考以下文章

带有复选框和单选按钮的 Android 列表视图

Android:如何在列表视图中自动显示带有复选框的 Sqlite 数据库

带有光标适配器滚动问题的android列表视图

如何使用复选框将Android联系人添加到列表视图中[重复]

Android - 通过复选框使用自定义适配器从列表视图中获取项目

单击按钮时如何在android中获取带有ListView值的复选框,EditText?