Java 处理选中然后取消选中的复选框';listview中的s值

Java 处理选中然后取消选中的复选框';listview中的s值,java,android,android-layout,listview,checkbox,Java,Android,Android Layout,Listview,Checkbox,在我的活动中,列表视图中有4个项目,每行有复选框。在我离开活动后,我希望所有选中的项目位置号都在arraylist中。当用户单击所有复选框并离开活动时,此代码工作正常。但当用户单击复选框然后取消选中时,项目位置为arraylist无法清除。这个方法在我的CustomAdapter类中 class GameAdapter extends BaseAdapter{ private ArrayList<Integer> positions = new ArrayList<

在我的活动中,列表视图中有4个项目,每行有复选框。在我离开活动后,我希望所有选中的项目位置号都在arraylist中。当用户单击所有复选框并离开活动时,此代码工作正常。但当用户单击复选框然后取消选中时,项目位置为arraylist无法清除。这个方法在我的CustomAdapter类中

class GameAdapter extends BaseAdapter{
      private ArrayList<Integer> positions = new ArrayList<Integer>();

      public ArrayList<Integer> getPositions() {
          return positions;
      }

      getView(....){
         final ViewHolder holder;
         holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if(holder.checkBox.isChecked()) {

                    positions.add(position);

                }
            }
        });
    }
}
class GameAdapter扩展了BaseAdapter{
private ArrayList positions=new ArrayList();
公共阵列列表getPositions(){
返回位置;
}
getView(…){
最终持票人;
setOnCheckedChangeListener(newcompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
if(holder.checkBox.isChecked()){
职位。添加(职位);
}
}
});
}
}
我在listview所在的活动中处理这个适配器类。在这里,我把arraylist的值取为

ArrayList<Integer> gamePositions = mGameAdapter.getPositions();
String itemNumbers = gamePositions.toString();
ArrayList gamePositions=mGameAdapter.getPositions();
String itemNumbers=gamePositions.toString();
在itemNumber字符串中,我需要所有选中的itemNumber值

提前感谢您的指导……

遵循以下方法

  • 使用HashMap而不是Arraylist,如下所示

      HashMap<Integer,Boolean> mapOfSelection = new HashMap<>();
    
  • 在onClick中,执行以下操作

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
            mapOfSelection.put((Integer)buttonView.getTag(),isChecked); // True if this position/value is checked, false otherwise.
        }
    
  • 现在,当您需要所选项目时,只需在hashmap中循环并检查具有
    True
    值的
    positions/Key

更换此

if(holder.checkBox.isChecked()) {

  positions.add(position);
}
用这个

 if(holder.checkBox.isChecked()) {
     if(!positions.contains(position))
        positions.add(position);

 } else {
     if(positions.contains(position))
         positions.remove(position);

 }

您在检查时将值添加到数组中,但在取消选中时您从未删除它们。我这样做了,但当我取消选中项目时,应用程序停止。再次检查答案,然后对其进行修改。这是更好的方法。您将得到解决。YW,请确保您的方法没有问题,因为arrayList.remove()有两个定义,一个用于remove(位置/整数),另一个用于remove(对象),还有一个对象/值作为整数,这可能会导致大型数据集出现问题,因为列表无法识别您是在为位置还是对象调用移除。是的,我只想将位置号作为名为string的“leagues”中的字符串发送。当然,请小心。您好……它起到了作用,但现在问题是当我单击一个复选框并取消选中它时,它给出了“不幸的是,应用程序已停止”错误,但当我选中它并在选中另一个复选框后取消选中它时,它不会…有点绕口令:-P但希望您理解..如果不清楚,请告诉我我将再次描述..java.lang.IndexOutOfBoundsException:无效索引2,大小为1,这是当我选中第二项并取消选中它时…您确定异常显示其中一行吗?让我们来看看。
 if(holder.checkBox.isChecked()) {
     if(!positions.contains(position))
        positions.add(position);

 } else {
     if(positions.contains(position))
         positions.remove(position);

 }