繁体   English   中英

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

[英]Custom listview with checkbox problem

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

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

它与此处的问题基本相同

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

谢谢 - 迈克

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

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

是的, ListView中的行是循环使用的,因此在离开getView之前,请确保填充行的所有相应数据。

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

检查下面的代码 -

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

请记住,使用change 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
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM