在我的活动中,我在列表视图中有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字符串中的我想要所有选中的项目编号值。
提前感谢您的指导......
答案 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);
}