【问题标题】:How to select only one checkbox selected in a ListView如何仅选择 ListView 中选中的一个复选框
【发布时间】:2012-07-18 14:13:46
【问题描述】:

我正在开发一个带有ListView 的Android 应用程序。这个ListView 中的每个项目都会有一个checkbox。

当用户点击其中一个项目时,我试图取消选中每个项目。例如。 ListView 有两个项目,0, 1。

此时选择了 0,用户点击了第 1 项。我想取消选择第 0 项。

这是我的代码。它在ArrayAdapter 内。

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View row = convertView;
    if (row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(itemLayoutId, parent, false);
    }

    Gate gate = gates.get(position);
    if (gate != null)
    {
        TextView itemText = (TextView)row.findViewById(R.id.gateNameText);
        if (itemText != null)
            itemText.setText(gate.getName());

        ImageView imageView = 
                (ImageView)row.findViewById(R.id.gateTypeImage);
        int resId;

        switch (gate.getSelTypeOperation())
        {
            case 0:
                resId = R.drawable.garage;
                break;
            case 1:
                resId = R.drawable.pulse;
                break;
            case 2:
                resId = R.drawable.onoff;
                break;
            default:
                resId = R.drawable.garage;
                break;
        }
        imageView.setImageResource(resId);

        CheckBox checkBox = 
                (CheckBox)row.findViewById(R.id.gateSelectedCheck);
        if (checkBox != null)
        {
            checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked)
                {
                    // Solo hago algo si el nuevo estado es marcado.
                    if (isChecked)
                        for(int i = 0; i < gates.size(); i++)
                        {
                            if (i != position)
                            {
                                Log.v("GatesAdapter", "uncheck: " + position);
                                View view = getView(i, null, null);
                                CheckBox checkBox = 
                                        (CheckBox)view.findViewById(R.id.gateSelectedCheck);
                                checkBox.setChecked(false);
                            }
                        }
                }
            });
            checkBox.setChecked(selectedGateIndex == position);
        }
    }

    return row;
}

但是,它不起作用。

我做错了什么?

【问题讨论】:

  • 我认为在这种情况下使用 RadioButtons 会更好。
  • 我可以在 ListView 中使用 RadioButtonGroup 吗?
  • 默认没有。在下面查看我的答案

标签: android listview android-arrayadapter


【解决方案1】:

您需要使用 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE) 并且您需要使自定义视图的行实现可检查。 .另一个 SO 问题已经存在 - soln 是 here

【讨论】:

【解决方案2】:

使用下面的这些代码,它会很好地为你工作

int selected_position =-1
public View getView(final int position, View convertView, ViewGroup parent)
{


if(selected_position==position)
        {
            CHECKBOX.setChecked(true);

        }
        else
        {
            CHECKBOX.setChecked(false);

        }

            CHECKBOX.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {



                    if (((CheckBox) view).isChecked())
                    {
                        selected_position= position;

                    }
                    else
                    {
                        selected_position=-1;
                    }


                    notifyDataSetChanged();


                }
            });
      return view;
    }

}

【讨论】:

    【解决方案3】:

    只需更改您的getview() 方法,如下所示:

    @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View vi = convertView;
            final Holder holder;
            if (vi == null) {
                vi = inflater.inflate(R.layout.raw_customelabel_list, null);
                holder = new Holder();
    
                holder.txtname = (TextView) vi
                        .findViewById(R.id.raw_customlabel_txt_name);
                holder.checkbox = (CheckBox) vi
                        .findViewById(R.id.raw_customlabel_checkbox);
                vi.setTag(holder);
    
            } else {
                holder = (Holder) vi.getTag();
            }
    
            vi.setTag(holder);
            holder.txtname.setText(strarry[position]);
    
            holder.checkbox.setId(position);
            holder.checkbox.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    for (int i = 0; i < strarry.length; i++) {
                        if (v.getId() == i) {
                            checkarry[i] = true;
                            Log.v("check", ""+position);
                        } else {
                            checkarry[i] = false;
                        }
                    }
                    notifyDataSetChanged();
                }
            });
    
            if (checkarry[position]) {
                holder.checkbox.setChecked(true);
            } else {
                holder.checkbox.setChecked(false);
            }
    
            return vi;
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      使用单选按钮。如果我看到复选框,我想我可以选择任意多个。

      如果您只是在代码中将 CheckBox 对象替换为 RadioButton 是否无法解决您的问题?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 2012-02-28
        • 1970-01-01
        • 2016-08-05
        相关资源
        最近更新 更多