Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使CardView中的复选框像RadioGroup一样工作?_Android_Checkbox_Android Cardview - Fatal编程技术网

Android 如何使CardView中的复选框像RadioGroup一样工作?

Android 如何使CardView中的复选框像RadioGroup一样工作?,android,checkbox,android-cardview,Android,Checkbox,Android Cardview,我想使我的CardView复选框的行为类似于一个RadioGroup,这样每当我检查另一张卡时,上一张卡就会被取消选中。我现在已经成功地创建了一个带有复选框的CardView,但我不知道如何使它们像我想要的那样工作 cardview.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:

我想使我的CardView复选框的行为类似于一个RadioGroup,这样每当我检查另一张卡时,上一张卡就会被取消选中。我现在已经成功地创建了一个带有复选框的CardView,但我不知道如何使它们像我想要的那样工作

cardview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:layout_margin="@dimen/activity_horizontal_margin"
    android:background="?android:selectableItemBackground"
    android:id="@+id/suggest_time_card_view"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="@dimen/activity_horizontal_margin"
        android:background="@drawable/back"
        android:gravity="center"
        android:padding="@dimen/activity_horizontal_margin"
        android:id="@+id/tvSuggestTime"
        />

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/cbSuggestTime"
            android:visibility="invisible"
            android:checked="false"
            android:padding="@dimen/activity_horizontal_margin"
            android:layout_alignBottom="@+id/tvSuggestTime"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>

</android.support.v7.widget.CardView>
CardViewAdapter:

public class SuggestTimeCardAdapter extends RecyclerView.Adapter<SuggestTimeCardAdapter.ViewHolder> {

private Context context;
private List<SuggestTimeList> suggestTimeLists;
private Integer selected_position = -1;

public SuggestTimeCardAdapter(List<SuggestTimeList> suggestTimeLists, Context context){
    super();
    this.suggestTimeLists = suggestTimeLists;
    this.context = context;
}

@Override
public SuggestTimeCardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.suggest_time_card, parent, false);
    SuggestTimeCardAdapter.ViewHolder viewHolder = new SuggestTimeCardAdapter.ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(final SuggestTimeCardAdapter.ViewHolder holder, final int position) {

    final SuggestTimeList suggestTimeList =  suggestTimeLists.get(position);

    holder.tvSuggestTime.setText(suggestTimeList.getSuggestTime());

    holder.cbSuggestTime.setChecked(position==selected_position);
    holder.cbSuggestTime.setVisibility(View.VISIBLE);
    holder.suggest_time_card_view.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            //implement the click
            Boolean CheckTime = suggestTimeList.getCheckTime();
            String reservationTime = holder.tvSuggestTime.getText().toString();
            Integer ItemId = suggestTimeList.getTimeId();
            holder.cbSuggestTime.setChecked(true);
            selected_position = position;
            for(SuggestTimeList s : suggestTimeLists) {
                s.setChecked(false);
            }
            suggestTimeList.setChecked(true);
            //notifyDataSetChanged();
        }
    });

}
@Override
public int getItemCount() {
    return suggestTimeLists.size();
}

class ViewHolder extends RecyclerView.ViewHolder {
    public TextView tvSuggestTime;
    public CheckBox cbSuggestTime;
    public CardView suggest_time_card_view;

    public ViewHolder(View itemView) {
        super(itemView);
        tvSuggestTime = (TextView) itemView.findViewById(R.id.tvSuggestTime);
        cbSuggestTime = (CheckBox) itemView.findViewById(R.id.cbSuggestTime);
        suggest_time_card_view = (CardView) itemView.findViewById(R.id.suggest_time_card_view);
    }
  }
}
是否使CardView中的复选框的行为类似于RadioGroup

您可以通过添加字段来存储复选框的状态来修改模型,如

boolean isSelected;

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
在onBindViewHolder中,可以使用此字段设置复选框。像这样:

// suggestTimeList is an item of list.
holder.cbSuggestTime.setCheck(suggestTimeList.isSelected());
holder.suggest_time_card_view.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){

            // your code ....
            // UnSelected all
            for (int i = 0; i < suggestTimeLists.size(); i++) {
                suggestTimeLists.get(i).setSelected(false);
            }
            // Only select card you have clicked
            suggestTimeLists.get(position).setSelected(true);
            notifyDataSetChanged();
        }
    });

请画你的效果图!您可以尝试将RadioGroup中的复选框放入xml中。@Jason抱歉,我忘了添加它,请参阅update@AnkitKumar这不是只适用于包含两个以上复选框的单个卡,而不适用于整个卡列表吗?根据用户期望行为,如果必须是单选,请使用单选按钮。如果确实需要使用单选复选框,请在每个复选框中添加一个字段isSelected,并在选择其他复选框时手动清除all。