如何创建具有第一选项和第二选项的复选框组?

时间:2019-07-15 17:08:37

标签: android

在我的应用程序中,用户将从列表中选择自己的爱好。 现在,我有一个回收站视图,其中显示了爱好的名称和图像以及一个复选框。

我只想启用2个复选框(我可以做到),并且当用户第一次单击一个复选框时,它将显示1而不是'check',并且当他选择第二个2

此外,当未选中1时,2将变成1

示例代码:

ArrayList checkedList = new ArrayList();

int first = -1;
int second = -1;

-

@Override
public void onBindViewHolder(@NonNull CustomItemHolder itemHolder, int i) {

    final int position = i;

    ...

    if (checkedList.size() > 2){

        itemHolder.checkBox.setClickable(false);
    }

    itemHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked){

                checkedList.add(position);

                if (first == -1){

                    first = position;
                }
                else if (second == -1){

                    second = position;
                }
            }
            else{

                checkedList.remove(position);

                if (first == position){

                    if (second == -1){

                        first = -1;
                    }
                    else{

                        first = second;
                        second = -1;
                    }
                }
                else if (second == position){

                    second = -1;
                }

            }
        }
    });
}

1 个答案:

答案 0 :(得分:0)

我的建议是为每个“爱好”分配一个唯一的ID

public class Hobby {
    private final int id;
    // ... other fields, getters
}

然后在Presentation对象内部(甚至现在只是在适配器中使它运行)存储已检查内容的列表:

List<Integer> checked;

绑定后,您可以检查此列表中的一些内容:

  1. 如果职位的ID是列表中的第一项(checked.indexOf(item)== 0),则您拥有#1
  2. 如果职位的ID是列表中的最后一项(checked.indexOf(item)== 1),那么您将获得#2
  3. 如果列表中有两个项目,但位置不是其中之一(checked.size()== 2 && check.indexOf(item)== -1),那么您知道要禁用它的复选框< / li>

当您单击某项的复选框并被选中时,会将其ID添加到checked列表的末尾。取消选中时,将其从列表中删除。通过使用这样的列表,您可以始终确保#1和#2处于正确的顺序,并自动使重新定位(#2变为#1)正确。

在更新检查的ID列表后,请记住在每次单击时都要通知notifyDataSetChanged()。您也可以通过更具体的调用来优化此设置,但这要复杂一些。