簡體   English   中英

android listview中的復選框有問題

[英]Checkboxes in android listview having problem

我有一個帶有自定義BaseAdapter的列表視圖,每行包含一個復選框和三個textview。 我正在使用Layoutinflater從xml文件中擴充此行。 但是,每次我選中一個復選框時,在整個列表中都會檢查許多其他復選框,而我想檢查的原始復選框有時會自行檢查,有時則不會。

每次用戶選中一個復選框時,我都會將該復選框附加的唯一值存儲在集合中。 下次調用getView方法時,我會根據復選框的值是否已經在集合中,在getView()內部返回視圖之前手動選中/取消選中該復選框。 但盡管如此,它仍然標記了這些復選框,即使這些復選框的checkedchangelistener沒有啟動。 我很懷疑這是因為在getView中重復使用了視圖,但是不知道什么是讓這整個工作變得有效的好方法。

避免if(convertView == null)和其他整個部分它肯定適合你。 謝謝。

問題肯定在你的getView()方法中;

嘗試這樣的事情

public View getView(int position, View convertView, ViewGroup parent) {
        View vu = convertView;
        ViewHolder vHolder = null;
        try {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (vu == null) {
                vu = (View) inflater.inflate(R.layout.list_fr_req, null);
                vHolder = new ViewHolder();
                vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox);
                vu.setTag(vHolder);
            } else {
                vHolder = (ViewHolder) vu.getTag();
            }
            vHolder.checkbox.setOnCheckedChangeListener(this);

            vHolder.checkbox.setId(position);
            vHolder.textView.setId(position);

            if (myList.get(position).getCheckedStatus())
                vHolder.checkbox.setChecked(true);
            else
                vHolder.checkbox.setChecked(false);

        } catch (Exception e) {
            Log.d("Exception in getview", e + "");
            e.printStackTrace();
        }
        return vu;
    }

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            list.get(buttonView.getId()).setCheckedStatus(true);
        } else {
            list.get(buttonView.getId()).setCheckedStatus(false);
        }
    }

    public static class ViewHolder {
        CheckBox checkbox;
        TextView textview;
    }

問候:N_JOY。

使用OnClickListener而不是OnCheckedChangeListener。 即使您更新循環視圖以匹配對象的值,也會觸發后者。 在下面的getView()代碼中,我使用HashMap來存儲對象的檢查值(itemMap)。

            boolean checked=itemMap.get(currentObject);
            if(checked!=checkBox.isChecked())
                checkBox.setChecked(checked);
            checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox checkBox1=(CheckBox)v;
                    if(checkBox1.isChecked()) //ckecked
                    {
                        itemMap.put(currentObject,true);
                        if(checkListener!=null)
                            checkListener.onCheck(position,convertView,parent,adapter);
                    }
                    else{ //unchecked
                        itemMap.put(currentObject,false);
                        if(checkListener!=null)
                            checkListener.onUnCheck(position,convertView,parent,adapter);
                    }
                }
            });

checkListener是一個額外的偵聽器,可以由類的用戶添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM