如何实现一个获取所有复选框状态的按钮,并将已检查项的值添加到arraylist中?

时间:2012-04-17 11:10:17

标签: java android checkbox

我一直在寻找解决我问题的方法但是找不到一个就这样了。

我有一个数据的arraylist,我使用textview和checkbox的组合显示。这是使用自定义适配器完成的,它基本上是逐行膨胀。到目前为止,一切都很好,直到我想要检索已检查的数据

我从其他人那里读到的是,由于视图的回收,滚动时他们的复选框变为未选中状态。 对我来说,复选框的状态仍为,但我不知道如何在不滚动的情况下退出它们。当我选中一个方框时,它在UI上“检查”,但是直到我将选中的项目滚出视图并再次返回时才会识别它。

目前,如果list.get(position).isSelected()== true,我使用全局arraylist填充list.get(position).getName()。但是你看到这个arraylist仍然是空的,除非我将项目滚出视图并再次返回。同样适用于未选中框时,它们会保留在arraylist中直到我滚动。我想到的是一个提交按钮,当单击它时,它会获取所有复选框的当前状态,然后构建arraylist。

任何想法如何创造这样的东西?

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.qlist, 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();
                //
                if(isChecked){
                    selctionCount++;
                }
                else if (!isChecked){
                    selctionCount--;
                }
                if(selctionCount > 2)
                {
                     Toast.makeText(context, "error, you checked more than 2!", Toast.LENGTH_LONG).show();
                     element.setSelected(false);
                }
                else
                {
                    element.setSelected(buttonView.isChecked());
                }
                System.out.println(selctionCount);
            }
        });
        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));

    } 
    else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());

    //This is the problem here! the selected arraylist (global) is empty even when i check the boxes, 
    //it only populates when i scroll the checked boxes out of view and back in! helphelp!
    holder.checkbox.setChecked(list.get(position).isSelected());
    if (list.get(position).isSelected() == true){
        selected.add(list.get(position).getName());
    }
    else if (list.get(position).isSelected() == false){
        selected.remove(list.get(position).getName());
    }
    return view;
}

}

1 个答案:

答案 0 :(得分:1)

我已经搞砸了类似的问题。您最初可以在构造函数中调用一个函数,该函数将复选框的状态初始化为false并保存arraylist中的所有状态。只要单击复选框,只需选中该框并将其状态保存在布尔arraylist中。 稍后您可以从arraylist中检索您的状态。 如果你不明白,请告诉我,我会尝试发送一些代码来帮助你......

以下是一些帮助您的代码: 我将创建一个布尔arraylist。

private ArrayList<Boolean> itemChecked      = null;

然后我将在构造函数中将所有复选框的状态设置为false:

    for (int i=0; i < no_of_elements.size(); i++) {
        itemChecked.add(i, false);
    }

单击复选框时设置实际检查状态:

        holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                                         boolean isChecked) {
                itemChecked.set(position, isChecked);

            }
        });