2017-02-15 1 views
0

Ich möchte, dass sich meine CardView CheckBox wie eine RadioGroup verhält, so dass bei jeder anderen Karte die vorherige deaktiviert wird. Ich habe jetzt erfolgreich ein CardView mit Checkboxen erstellt, aber ich bin mir nicht sicher, wie ich sie so verhalten soll, wie ich es möchte.Wie funktioniert das Kontrollkästchen in CardView wie RadioGroup?

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); 
    } 
    } 
} 

Previous checkbox is still checked need it to be unchecked after checking another card

+0

bitte zeichne dein effektbild! – Fang

+0

Sie können versuchen, Checkboxen in RadioGroup in Ihr XML einzufügen. – Android

+0

@Jason Tut mir leid, ich habe vergessen, das hinzuzufügen, siehe Update – JerryKo

Antwort

1

Make Checkbox in CardView wie Radiogroup verhalten?

Sie können Ihr Modell ändern, indem Sie ein Feld (zum Speichern von Zustand Checkbox) hinzufügen wie

boolean isSelected; 

    public boolean isSelected() { 
     return isSelected; 
    } 

    public void setSelected(boolean selected) { 
     isSelected = selected; 
    } 

Und in Ihrem onBindViewHolder, können Sie dieses Feld Checkbox setzen verwenden. wie folgt:

// 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(); 
     } 
    }); 
Verwandte Themen