私はすべてのアイテムがラジオグループにグループ化された3つのラジオボタンを持っているrecyclerviewを持っています。現在、ユーザーはrecyclerviewのアイテムごとに1つのラジオボタンのみを選択できます。しかし、私はユーザーに、recyclerview全体でラジオボタンを1つだけ選択してほしいと思っています。どうすればこれを達成できますか?
これが現在の外観です。
リサイクル業者ビュー全体で1つのラジオボタンのみをチェックできるようにしたいと思います。最初の項目の1番目のラジオボタンがチェックされている場合、ユーザーが2番目の項目の2番目のラジオボタンをクリックすると、1番目の項目の1番目のラジオボタンがオフになります。
これを行う別の方法を次に示します。これは私の以前の答えよりもエレガントです。ただし、前の回答の方が柔軟性が高いため、両方を保持しました。
private RadioButton lastCheckedRB = null;
...
@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
holder.priceRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton checked_rb = (RadioButton) group.findViewById(checkedId);
if (lastCheckedRB != null) {
lastCheckedRB.setChecked(false);
}
//store the clicked radiobutton
lastCheckedRB = checked_rb;
}
});
これが私のために働いたものです:
private RadioButton lastCheckedRB = null;
...
@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
View.OnClickListener rbClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
RadioButton checked_rb = (RadioButton) v;
if(lastCheckedRB != null){
lastCheckedRB.setChecked(false);
}
lastCheckedRB = checked_rb;
}
};
//price_1m, price3m, price_6m are RadioButtons inside a radiogroup
holder.price1m.setOnClickListener(rbClick);
holder.price3m.setOnClickListener(rbClick);
holder.price6m.setOnClickListener(rbClick);
ここで、ラジオボタンはlastCheckedRBに一時的に保存されます。新しいラジオボタンをクリックすると、古いラジオボタンはオフになります。最初、lastCheckedRBはnullに設定されています。
私はこのアプローチを使用しました
public class OffersRecyclerViewAdapter extends RecyclerView.Adapter<OffersRecyclerViewAdapter.ViewHolder> {
private List<OffersModel> offersList;
private Context context;
private int lastSelectedPosition = -1;
public OffersRecyclerViewAdapter(List<OffersModel> offersListIn, Context ctx) {
offersList = offersListIn;
context = ctx;
}
@Override
public OffersRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.offer_item, parent, false);
OffersRecyclerViewAdapter.ViewHolder viewHolder =
new OffersRecyclerViewAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(OffersRecyclerViewAdapter.ViewHolder holder, int position) {
//since only one radio button is allowed to be selected,
// this condition un-checks previous selections
holder.selectionState.setChecked(lastSelectedPosition == position);
}
@Override
public int getItemCount() {
return offersList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public RadioButton selectionState;
public ViewHolder(View view) {
super(view);
selectionState = (RadioButton) view.findViewById(R.id.offer_select);
selectionState.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
lastSelectedPosition = getAdapterPosition();
notifyDataSetChanged();
}
});
}
}
}
受け入れられた回答で問題に直面しました。時々、それは現在チェックされたラジオボタンをチェックされないままにし、ラジオボタンのどれも選択されないままにします。これは、1つのグループからラジオボタンを選択した後で、別のラジオグループのラジオボタンを選択すると発生していました。
以下に示すように、最後にチェックされたRadioButtonを保存する代わりに、最後にチェックされたRadioGroupを保存し、最後にチェックされたRadioGroupが現在のものではなく、ラジオボタンが選択されている場合は、最後のチェックをクリアするソリューションです。
詳細については http://www.zoftino.com/Android-recyclerview-radiogroup を参照してください
priceGroup = (RadioGroup) view.findViewById(R.id.price_grp);
priceGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if (lastCheckedRadioGroup != null
&& lastCheckedRadioGroup.getCheckedRadioButtonId()
!= radioGroup.getCheckedRadioButtonId()
&& lastCheckedRadioGroup.getCheckedRadioButtonId() != -1) {
lastCheckedRadioGroup.clearCheck();
Toast.makeText(PackageRecyclerViewAdapter.this.context,
"Radio button clicked " + radioGroup.getCheckedRadioButtonId(),
Toast.LENGTH_SHORT).show();
}
lastCheckedRadioGroup = radioGroup;
}
});
同様のことを試してください:
_public void onCheckedChanged(RadioGroup radioGroup, int checkedItemId) {
mCheckedId = checkedItemId;
mSelectedPosition = getAdapterPosition();
}
_
上記のコードは、onCreateViewHolder()
内のRadioGroup
に登録するリスナーです。接頭辞付きの項目は、アダプタのフィールドです。
onBindViewHolder()
内:
_if (position == mSelectedPosition) {
holder.radioGroup.check(mCheckedId);
} else {
holder.radioGroup.clearCheck();
}
_
このように動作するはずです。
final String[] country_selcted = new String[1];
holder.rb_team_one.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b==true)
country_selcted[0] =holder.rb_team_one.getText().toString();
else
country_selcted[0] =holder.rb_team_two.getText().toString();
}
});
次に、country_selcted [0]を出力して、ラジオグループの選択結果のみを行に表示します。