2017-04-25 26 views
1

cardViewで生成されたリストから一度に1つのラジオボタンだけを選択しようとしています。私はthis oneを含む多くの答えを試しました。しかし、これらのどれも働いていないようです。ここでは、あなたのモデルクラスにブール値を追加し、ラジオ、チェック変更のリスナーにチェックしており、 group_list_item.xmlAndroidのCardViewでラジオボタンを1つだけ選択する方法は?

<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view= "http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_marginLeft="1dp" 
android:layout_marginRight="1dp" 
android:layout_marginTop="1dp" 
android:elevation="1dp" 
card_view:cardCornerRadius="1dp"> 
<RelativeLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="70dp" 
    android:padding="10dp" 
    android:background="?android:selectableItemBackground"> 
    <TextView 
     android:text="Description" 
     android:id="@+id/owner" 
     android:textStyle="italic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginStart="84dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentStart="true" /> 
    <TextView 
     android:text="Title" 
     android:textSize="25dp" 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignStart="@+id/username" /> 
    <RadioButton 
     android:text="Select" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginEnd="23dp" 
     android:id="@+id/radioButton" /> 
</RelativeLayout> 

私のコードCustomGroupAdapter.java

public class CustomGroupAdapter extends RecyclerView.Adapter<CustomGroupAdapter.MyVH>{ 
private int selectedPosition = -1; 
View view; 
Context context; 
private List<GroupDataModel> dataModels; 
private LayoutInflater inflater; 
public CustomGroupAdapter(Context context, List<GroupDataModel> data){ 
    this.context = context; 
    this.dataModels = data; 
    this.inflater = LayoutInflater.from(context); 
} 
@Override 
public MyVH onCreateViewHolder(ViewGroup parent, int viewType) { 
    view = inflater.inflate(R.layout.group_list_item, parent, false); 
    MyVH myVH = new MyVH(view); 
    return myVH; 
} 
@Override 
public int getItemCount() { 
    return dataModels.size(); 
} 

@Override 
public void onBindViewHolder(final MyVH holder, final int position) { 

    GroupDataModel dataModel = dataModels.get(position); 
    holder.setData(dataModel, position); 
    final RadioButton radioButton = (RadioButton) holder.itemView.findViewById(R.id.radioButton); 
    holder.itemView.findViewById(R.id.radioButton).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (selectedPosition == -1) { 
       radioButton.setChecked(position == getItemCount() - 1); 
      } else { 
       radioButton.setChecked(selectedPosition == position); 
      } 
     } 
    }); 
} 
class MyVH extends RecyclerView.ViewHolder{ 
    TextView name; 
    TextView owner; 
    int postion; 
    GroupDataModel dataModel; 
    public MyVH(View itemView) { 
     super(itemView); 
     name = (TextView) itemView.findViewById(R.id.name); 
     owner = (TextView) itemView.findViewById(R.id.owner); 
    } 
    public void setData(GroupDataModel dataModel, int position) { 
     this.name.setText(dataModel.getName()); 
     this.owner.setText(dataModel.getOwner()); 
     this.postion = position; 
     this.dataModel = dataModel; 
    } 
    } 
} 
+0

'RadioButton'sは通常' RadioGroup'内で使用されています。 'RadioButton'が1つしかない場合は、' CheckBox'を使う方が良いでしょう。 –

+0

あなたは、他のカードのラジオが選択されている場合は、それを削除して電流をチェックするというカードビューを確認する必要があります。その後、両方のカードのnotifyitemを受信します。 –

+0

@Veneed Reddy単一の項目にはラジオボタンが1つしかありません。しかし、複数のアイテムがあるため。一度に1つの項目だけを選択する必要があるため、CheckBoxを使用することはできません。 –

答えて

0

ですあなたのリストに位置ワイズフラグを設定し、アダプタに通知してください

+0

投稿したコードを修正してもらえますか? –

0

私はコードを変更してテストすることで問題を解決しました。それは実際にthis answer.からですが、私はcardViewのためにそれを使用しました。

public class CustomGroupAdapter extends RecyclerView.Adapter<CustomGroupAdapter.MyVH>{ 
RadioButton radioButton; 
View view; 
Context context; 
private List<GroupDataModel> dataModels; 
private LayoutInflater inflater; 
public CustomGroupAdapter(Context context, List<GroupDataModel> data){ 
    this.context = context; 
    this.dataModels = data; 
    this.inflater = LayoutInflater.from(context); 
} 
@Override 
public MyVH onCreateViewHolder(ViewGroup parent, int viewType) { 
    view = inflater.inflate(R.layout.group_list_item, parent, false); 
    MyVH myVH = new MyVH(view); 
    return myVH; 
} 
@Override 
public int getItemCount() { 
    return dataModels.size(); 
} 

@Override 
public void onBindViewHolder(final MyVH holder, final int position) { 

    GroupDataModel dataModel = dataModels.get(position); 
    holder.setData(dataModel, position); 
    holder.itemView.findViewById(R.id.radioButton).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(radioButton == null){ 
       radioButton = (RadioButton) v; 
      radioButton.setChecked(true); 
     } 
     if(radioButton== v) 
       return; 
     radioButton.setChecked(false); 
     ((RadioButton)v).setChecked(true); 
     radioButton = (RadioButton)v; 
    } 
    }); 
} 
class MyVH extends RecyclerView.ViewHolder{ 
    TextView name; 
    TextView owner; 
    int postion; 
    GroupDataModel dataModel; 
    public MyVH(View itemView) { 
     super(itemView); 
     name = (TextView) itemView.findViewById(R.id.name); 
     owner = (TextView) itemView.findViewById(R.id.owner); 
    } 
    public void setData(GroupDataModel dataModel, int position) { 
     this.name.setText(dataModel.getName()); 
     this.owner.setText(dataModel.getOwner()); 
     this.postion = position; 
     this.dataModel = dataModel; 
    } 
} 

}

関連する問題