如何使用多个复选框保持列表视图中已选项的值?

时间:2011-11-22 05:26:32

标签: android listview android-widget

我正在寻找带有多个复选框的列表视图。用户应该能够选中多个复选框并单击“提交”按钮继续进行。

我正在使用自定义适配器来显示我自己的列表视图并覆盖getView()方法。

到目前为止一切顺利,我能够显示带有复选框的列表,我可以选择多个复选框,但是当我尝试获取所选列表项详细信息时(使用list.get(position).getName()),它开始弹跳。我的意思是,当我开始滚动列表视图以选择更多项目时,上面的值将更改为不同的项目而不保留原始项目。

我的代码在这里:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.checkboxlayout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.label);
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);

            viewHolder.checkbox         .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    Model element = (Model) viewHolder.checkbox.getTag();
    element.setSelected(buttonView.isChecked());
//Toast.makeText(getContext(), "You just checked: "+list.get(position).getName(), Toast.LENGTH_SHORT).show();
    System.out.println("The element name is: "+element.getName());
    System.out.println("Name of the checked item is--outside loop:"+list.get(position).getName());

}

});

即使在继续滚动检查其他项目之后,是否有办法约束或保留我选择的项目的值。

3 个答案:

答案 0 :(得分:1)

问题是您正在回收系统提供的convertView。如果它存在(它不是null),这并不意味着它包含您期望的确切旧视图,但可能是另一个。

因此系统可能会回收一个“勾选”复选框视图,其中旧复选框未被取消,反之亦然。我有这种情况所以专注于这个问题可能会帮助你解决你所面临的问题。

编辑:要解决此问题,如果您有循环视图,则只需重新初始化视图属性,或者(不鼓励)只需忽略convertView参数并在每次调用getView方法时创建新视图

答案 1 :(得分:0)

您不必编写自定义适配器或自定义视图。 Android已经实现了您需要的功能,使用它可能完全绕过您的问题。

您所要做的就是将ListView的“选择模式”设置为CHOICE_MODE_MULTIPLEsetChoiceMode(int)

您可以使用getCheckedItemCount() getCheckedItemIds()等方法检索选中的项目。更多信息请点击此处:android:choiceMode

答案 2 :(得分:0)

Lalit Poptani给出的回应非常有帮助。我可以通过他建议的修复来解决我的问题。以下是解决此类问题的链接:Getting an issue while checking the dynamically generated checkbox through list view