在我的自定义列表视图中添加一个复选框(一次只能选中一个)

Posted

技术标签:

【中文标题】在我的自定义列表视图中添加一个复选框(一次只能选中一个)【英文标题】:Adding a check box (only one can be checked at a time) to my custom list view 【发布时间】:2015-05-16 15:08:25 【问题描述】:

我已经制作了我的自定义适配器,并且正在调整一系列“人员”。在我的列表项 xml 中,我放了一个复选框,但这是我感到困惑的地方。我希望我的列表一次只能选中一个复选框。而且我还想实现某种 OnCheckBox 点击监听器,以便在每次选择不同的复选框时执行一个操作。

这是我的自定义适配器

 public class PersonAdapter extends BaseAdapter 

Context mContext;
Person[] mPersonArray;

public PersonAdapter(Context context , Person[] persons) 
    mContext = context;
    mPersonArray = persons;


@Override
public int getCount() 
    return mPersonArray.length;


@Override
public Object getItem(int position) 
    return mPersonArray[position];


@Override
public long getItemId(int position) 
    return 0;        // we wont use


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    ViewHolder holder;

    if (convertView == null) 
        // brand new
        convertView = LayoutInflater.from(mContext).inflate(R.layout.person_list_item , null);
        holder = new ViewHolder();
        holder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
        holder.birthDateText = (TextView) convertView.findViewById(R.id.birthDateTextView);
        holder.checkBoxList = (CheckBox) convertView.findViewById(R.id.checkBox);

        convertView.setTag(holder);

     else 
        holder = (ViewHolder) convertView.getTag();
    

    Person personForList = mPersonArray[position];

    holder.nameText.setText(personForList.getName());
    holder.birthDateText.setText(personForList.getBirthDate());





    return convertView;


public static class ViewHolder 
    TextView nameText;
    TextView birthDateText;
    CheckBox checkBoxList;

这是我的列表项 xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_
            android:layout_
            tools:background="#ff53">

<TextView
    android:layout_
    android:layout_
    android:text="Evan Dix"
    android:id="@+id/nameTextView"
    android:textColor="#ff323232"
    android:textSize="30sp"
    android:layout_marginLeft="50dp"
    android:layout_marginStart="86dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"/>

<TextView
    android:layout_
    android:layout_
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="11-12-12"
    android:id="@+id/birthDateTextView"
    android:textColor="#ff323232"

    android:layout_marginStart="23dp"
    android:layout_centerVertical="true"
    android:layout_toEndOf="@+id/imageView"/>

<ImageView
    android:layout_
    android:layout_
    android:id="@+id/imageView"
    android:src="@android:drawable/presence_invisible"
    android:layout_centerVertical="true"
    android:layout_toEndOf="@+id/nameTextView"
    android:layout_marginStart="12dp"/>

<CheckBox
    android:layout_
    android:layout_
    android:id="@+id/checkBox"
    android:layout_centerVertical="true"
    android:layout_alignParentEnd="true"
    android:layout_marginEnd="29dp"
    android:checked="false"
    android:clickable="true"
    android:choiceMode = "singleChoice"/>

在我填充列表视图的班级内......它扩展了 ListAdapter

 Person[] personArray = new Person[mPersonArrayList.size()];
    personArray = mPersonArrayList.toArray(personArray);

    PersonAdapter adapter = new PersonAdapter(this , personArray);
    setListAdapter(adapter);

【问题讨论】:

使用成员变量存储当前选中的索引,为每个更新该索引的复选框注册一个监听器,并在getView中使用它来设置当前复选框状态。 我不同意 Visionwriter 和 cchapman,在下面发布了答案。 ListView 上的行项目有自己的视图。它们不能像 RadioButtons 或一组单选按钮那样分组。 但是我认为你应该改变使用复选框的 UI 设计。通常用户可以选择多个复选框,不止一个。这是趋势,不应偏离。建议,当用户选择一个行项目时,如何高亮显示,并且只能高亮一个项目? 【参考方案1】:

我在我的项目中使用过这个,你也可以试试,但是如果你必须一次选中一个复选框,那么为什么要使用复选框,你必须使用单选按钮。

 // initialize selectPosition in your base adapter
    int selectedPosition =   -1; 

    @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            ViewHolder holder;

            if (convertView == null) 
                // brand new
                convertView = LayoutInflater.from(mContext).inflate(R.layout.person_list_item , null);
                holder = new ViewHolder();
                holder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
                holder.birthDateText = (TextView) convertView.findViewById(R.id.birthDateTextView);
                holder.checkBoxList = (CheckBox) convertView.findViewById(R.id.checkBox);

                convertView.setTag(holder);

             else 
                holder = (ViewHolder) convertView.getTag();
            

            Person personForList = mPersonArray[position];

            holder.nameText.setText(personForList.getName());
            holder.birthDateText.setText(personForList.getBirthDate());
          holder.checkBoxList.setChecked(position == selectedPosition);
                 holder.checkBoxList.setTag(position);
        holder.checkBoxList.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View view) 

                        selectedPosition = (Integer) view.getTag();

                        notifyDataSetInvalidated();
                        notifyDataSetChanged();
                    
                );




            return convertView;
        

【讨论】:

我做到了,而且效果很好,谢谢!所以现在你能帮我解决下一步会发生什么吗?在我的类中扩展 ListAdapter 如果我想记录已选择的项目,我该怎么办?我试图实现 oncheckchangedlistener ...但我很困惑。这是正确的方法吗?谢谢@Surender Kumar 对不起,迟到了,但实际上我对此一无所知,因为我从未在 listadapter 上工作过。【参考方案2】:

听起来您正在寻找的是单选按钮而不是复选框。

制作了复选框,以便您可以选择一个类别的多个项目,其中制作了单选按钮,以便您只能单击其中一个类别。

【讨论】:

以上是关于在我的自定义列表视图中添加一个复选框(一次只能选中一个)的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 视图模块卡在我的自定义主题上

当我取消选中自定义树视图中的子节点复选框时,如何取消选中所有父节点

列表视图中的 csv 和复选框将选中的复选框代码保存在 ArrayAdapter 中

Android - 复选框在列表视图中每 10 次重复一次

getView() 在我的自定义列表视图中不起作用

在我的自定义列表项中单击书签图像的侦听器,多次更改另一个 row_item 图像