Checkbox与ListView无法正常工作

时间:2012-08-23 06:07:41

标签: android listview checkbox

我正在为listview的每个Iten实现带有listview的复选框。我得到的问题是当我点击任何一个复选框时,其他一些未被点击的复选框也被随机点击。

public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View vi = convertView;
            final int as=position;
            if (convertView == null) { // if it's not recycled, initialize some
                // attributes
                LayoutInflater  inflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vi = inflater.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();

                holder.textheader = (TextView) vi.findViewById(R.id.item1);
                holder.textcpu = (TextView) vi.findViewById(R.id.item2);
                holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
                holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
                holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
                vi.setTag(holder);

                holder.text_checkbox.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, true);
                            packages=as;
                        } else if (!holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, false);
                        }
                        String packag=app_package.get(as);
                        Log.d("package listttttttttt", packag);
                    }
                });


            } else {
                holder = (ViewHolder) vi.getTag();


            }

3 个答案:

答案 0 :(得分:3)

尝试以下代码

public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View vi = convertView;
        final int as=position;
        if (convertView == null) { // if it's not recycled, initialize some
            // attributes
            LayoutInflater  inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.grid_item, null);
            holder = new ViewHolder();

            holder.textheader = (TextView) vi.findViewById(R.id.item1);
            holder.textcpu = (TextView) vi.findViewById(R.id.item2);
            holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
            holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
            holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
            vi.setTag(holder);

        } else {
            holder = (ViewHolder) vi.getTag();
        }          


             holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
             {          
              public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)      
                {                                  
                if(isChecked)
                {
                      // do your stuff
                      itemChecked.set(as, true);
                        packages=as;
                }
                else
                {
                      // do your stuff
                      itemChecked.set(as, false);
                }       

        }
    });

if(itemChecked.size() != 0 && itemChecked.get(position))
        holder.text_checkbox.setChecked(true);
    else
        holder.text_checkbox.setChecked(false);

答案 1 :(得分:1)

问题是您的getView()方法无法正确处理视图。您必须设置新视图的状态并更新回收视图的状态。此外,您还必须定义视图的行为。 SO上有很多线程有类似的问题。我认为this one可以帮助您(它包含工作代码)。

您的代码应如下所示:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final int as=position;
    if (convertView == null) { // no view passed, create one
        LayoutInflater  inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = inflater.inflate(R.layout.grid_item, null);
        // Setup the View content
        holder = new ViewHolder();
        holder.textheader = (TextView) vi.findViewById(R.id.item1);
        holder.textcpu = (TextView) vi.findViewById(R.id.item2);
        holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
        holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
        holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
        // Do your checkbox initial setup here. 
        holder.text_checkbox.setChecked(getBooleanFromPosition(position));
        vi.setTag(holder);
        // Setup the View behavior
         holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
         {          
              // Do your stuff here
    });
    } else {
        // Update your View state
        holder = (ViewHolder) vi.getTag();
        holder.text_checkbox.setChecked(getBooleanFromPosition(position));
    }                   

显然,您必须将复选框的状态存储在某些数据结构中,例如布尔数组并读取该数据结构,以便知道是否选中/取消选中给定位置的复选框(读取访问权限是应该getBooleanFromPosition。并且应该在控制View行为的部分中更新该数据结构。

答案 2 :(得分:1)

问题在于,您不允许将焦点项与列表视图结合使用,但有一种解决方法:

如果您使用XML布局作为列表项,请将checkboxable focus属性设置为false:

android:focusable="false"

这也应该使列表项也可以点击。

我希望这能解决你的问题。请告诉我它是怎么回事。