【问题标题】:How to hold the value of the checked Item in List view with multiple check boxes? [duplicate]如何通过多个复选框在列表视图中保存选中项目的值? [复制]
【发布时间】:2012-01-03 13:48:56
【问题描述】:

我希望实现一个带有多个复选框的列表视图。用户应该能够选择多个复选框并单击“提交”按钮以继续进行。

我正在使用自定义适配器来显示我自己的列表视图并覆盖 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());

}

});

有没有办法限制或保持我选择的项目的值,即使在继续滚动以检查其他项目之后也是如此。

【问题讨论】:

  • 查看我的答案here 以及完整的线程,以了解这里发生了什么。 Knickedi 在我的回答下方进行了精彩的解释。
  • 嗨拉利特,感谢您的回复。我已经完成了您最初的解决方案和 Knickedi 的方法。尽管您的解决方案对我有用,但正如您建议与 Knickedi 的方法相处的那样,我正在尝试实施他的建议(尽管不是一个直接的解决方案)。我会尽量落实他的建议。
  • 嗯,我现在回答的方法是正确的。

标签: android listview android-widget


【解决方案1】:

问题是你在回收系统提供的convertView。如果它存在(不是null),这并不意味着它包含您所期望的完全相同的旧视图,而可能是另一个视图。

因此,系统可能会回收一个“已勾选”的复选框视图,而旧复选框未勾选,反之亦然。我遇到过这种情况,因此专注于这个问题可能会帮助您解决您面临的问题。

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

【讨论】:

  • 是的 STT LCU(很抱歉无法获得您的简称),感谢您的回复,是的,您是对的。我也很想了解如何避免发生回收的这种情况。
  • 我已经用一个小的解决方案建议编辑了我的答案。如果您认为正确,请在已接受的答案上打勾。
【解决方案2】:

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

您只需将ListView 的“选择模式”设置为CHOICE_MODE_MULTIPLEsetChoiceMode(int)

您可以使用getCheckedItemCount()getCheckedItemIds() 等方法检索选中的项目。更多信息在这里:android:choiceMode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2017-05-05
    • 2016-02-13
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多