在listview android

时间:2016-02-01 22:53:11

标签: java android android-layout listview checkbox

在我的活动中,我在列表视图中有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);

                }
            }
        });
    }
}

我在listview所在的活动中处理此适配器类。在那里,我正在接受这样的arraylist值

ArrayList<Integer> gamePositions = mGameAdapter.getPositions();
String itemNumbers = gamePositions.toString();
itemNumber字符串中的

我想要所有选中的项目编号值。

提前感谢您的指导......

2 个答案:

答案 0 :(得分:1)

遵循以下方法。

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

      HashMap<Integer,Boolean> mapOfSelection = new HashMap<>();
    
  • onClick方法之前
  • ,将position分配给复选框,如下所示。

     holder.checkbox.setTag(position);
    
  • 在onClick中,执行以下操作。

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

答案 1 :(得分:1)

替换此

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);

 }