自定义列表视图与复选框问题

时间:2011-03-25 21:36:38

标签: android list listview view checkbox

我正在尝试创建一个自定义列表,其中包含允许您从列表中选择多个项目的复选框。

带有复选框的列表显示正常,但是如果我勾选一个复选框,然后再滚动列表中的其他项目也会被检查。

它与here

基本相同

我知道它与android回收视图的方式有关,但我不知道如何解决这个问题!有人可以帮助我吗?

谢谢 - 迈克

4 个答案:

答案 0 :(得分:5)

您需要一个数据结构来跟踪检查哪些行。这可以像bool[] checked一样简单。

getView中,请确保将复选框状态设置为checked[position]的内容。您还应该在getView的复选框中set an OnCheckedChangedListener,以便他们使用checked[position] = isChecked更新您的数据。

是的,ListView中的行已被回收,因此请确保在离开getView之前填充一行的所有相应数据。

答案 1 :(得分:2)

您可以尝试为复选框实现OnClickListener而不是OnCheckChangedListener。它对我有用。

答案 2 :(得分:0)

创建ArrayList<Integer>。在您的复选框中添加OnCheckChangedListener。在更改后的方法中,将列表视图position添加或删除到ArrayList<Integer>

getView方法中,检查ArrayList<Integer>是否包含当前列表视图position。如果它包含位置,则将checked设置为true,否则设置为false。

每次点击复选框时,都可以从Integer添加或删除ArrayList

答案 3 :(得分:0)

检查以下代码 -

public View getView(int position, View convertView, ViewGroup parent){
            View view = convertView;
            ViewHolder holder = new ViewHolder();

            if(view == null){

                view = inflater.inflate(R.layout.list_callcycle_blue, null);                
                holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container);
                holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc);
                holder.cb = (CheckBox) view.findViewById(R.id.cb_store);

                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            final Object data = getItem(position);
            holder.lblLabel.setText(data.getDescription());

            holder.cb.setTag(position);
            holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    int position = (Integer) buttonView.getTag();
                    objects.get(position).setChecked(buttonView.isChecked());
                }
            });
            holder.cb.setChecked(isChecked(position));

            return view;
        }

请始终牢记,在设置数据之前使用更改holder.cb.setOnCheckedChangeListener() 任何听众,在我们的例子中是holder.cb.setChecked()

原因:当我们滚动时,listview将回收视图,因此如果在侦听器之前使用setchecked,那么它将在旧侦听器的基础上选择值。如果我们在监听器之后设置它,那么它将采用最新值

编辑部分 下面的部分将说明用于检索已检查数据的isChecked()setChecked()方法

/*
 * This function is in your Custom Adapter Class
 */
private boolean isChecked(int position){
    return object(position).isChecked();
}


/**
 * Getter Setter Class / Data Model Class that defines your object
 */
private class MyObject{
    private boolean isChecked;
    private String a, b, c, orWhateverYourObjectNeeds;

    public void setChecked(boolean isChecked){
        this.isChecked = isChecked;
    }

    public boolean isChecked(){
        return isChecked
    }
}