1

我正在为 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();


            }
4

3 回答 3

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);
于 2012-08-23T06:27:46.080 回答
1

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

您的代码应类似于以下框架:

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行为的部分中更新该数据结构。

于 2012-08-23T06:31:00.580 回答
1

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

如果您使用 XML 布局作为列表项,请将复选框可聚焦属性设置为 false:

android:focusable="false"

这应该会导致列表项也可以单击。

我希望这能解决你的问题。请让我知道情况如何。

于 2012-08-23T07:21:04.463 回答