簡體   English   中英

RadioGroup 中的 RecyclerView 和 RadioButton

[英]RecyclerView And RadioButton in RadioGroup

我有 RecyclerView,在 RowItem 布局中,我有 RadioGroup,其中有兩個 RadioButton。 如果我選擇 First Item 並滾動到底部,第 8 個,第 16 個,...所以檢查:| 怎么處理?

tnx的答案..如果你需要任何信息..我把主題

ques_item_row.xml

 <RadioGroup
                    android:id="@+id/ques_radio_group"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/txt_ques_title"
                    android:layout_gravity="end|center"
                    android:gravity="start"
                    android:orientation="vertical"
                    android:textAlignment="textStart"
                    android:textDirection="rtl">

                    <android.support.v7.widget.AppCompatRadioButton
                        android:id="@+id/first_ques"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="end|right"
                        android:layout_margin="@dimen/quest_margin"
                        android:gravity="end|right"
                        android:checked="false"
                        android:padding="@dimen/quest_padding"
                        android:text="@{question.firstQuest}"
                        android:textColor="@color/ques"
                        android:textDirection="ltr"
                        android:textSize="@dimen/text_ques"
                        />

                    <android.support.v7.widget.AppCompatRadioButton
                        android:id="@+id/second_ques"
                        android:layout_below="@+id/first_ques"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="end|right"
                        android:layout_margin="@dimen/quest_margin"
                        android:gravity="end|right"
                        android:checked="false"
                        android:padding="@dimen/quest_padding"
                        android:text="@{question.secondQuest}"
                        android:textColor="@color/ques"
                        android:textDirection="ltr"
                        android:textSize="@dimen/text_ques"
                        />


                </RadioGroup>

問題.java

public class Question {

  private String questNum;
  private String questTitle;
  private String firstQuest;
  private String secondQuest;
  private int score = 0;
  private int firstQuestScore = 2;
  private int secondQuestScore = 3;

  private boolean isFirstChecked;
  private boolean isSecondChecked;


  public Question(String questNum, String questTitle, String firstQuest, String secondQuest) {
    this.questTitle = questTitle;
    this.firstQuest = firstQuest;
    this.secondQuest = secondQuest;
    this.questNum = questNum;

  }

  public Question() {

  }


  public String getQuestTitle() {
    return questTitle;
  }

  public void setQuestTitle(String questTitle) {
    this.questTitle = questTitle;
  }

  public String getFirstQuest() {
    return firstQuest;
  }

  public void setFirstQuest(String firstQuest) {
    this.firstQuest = firstQuest;
  }

  public String getSecondQuest() {
    return secondQuest;
  }

  public void setSecondQuest(String secondQuest) {
    this.secondQuest = secondQuest;
  }

  public String getQuestNum() {
    return questNum;
  }

  public void setQuestNum(String questNum) {
    this.questNum = questNum;
  }

  public boolean isFirstChecked() {
    return isFirstChecked;
  }

  public void setFirstChecked(boolean firstChecked) {
    isFirstChecked = firstChecked;
  }

  public boolean isSecondChecked() {
    return isSecondChecked;
  }

  public void setSecondChecked(boolean secondChecked) {
    isSecondChecked = secondChecked;
  }

  public int getScore() {
    return score;
  }

  public void setScore(int questNum, int questScore) {
    this.score = ((questNum * questScore) + questNum);
  }


  public int getFirstQuestScore() {
    return firstQuestScore;
  }

  public void setFirstQuestScore(int firstQuestScore) {
    this.firstQuestScore = firstQuestScore;
  }

  public int getSecondQuestScore() {
    return secondQuestScore;
  }

  public void setSecondQuestScore(int secondQuestScore) {
    this.secondQuestScore = secondQuestScore;
  }


  public void mathScore(int questNum, int questScore) {
  }
}

問題適配器.java

 public class MbtiQuestAdapter extends RecyclerView.Adapter<MbtiQuestAdapter.MbtiQuestViewHolder> {

  private Context context;
  private List<Question> questionList;
  private LayoutInflater layoutInflater;
  private FloatingActionButton fabResult;
  private CoordinatorLayout coordinator;
  private int checkRadio = 0;
  private Snackbar snackbar;
  private int totalScore = 0;


  private static final String TAG = "MbtiQuestAdapter";

  public MbtiQuestAdapter(Context context, List<Question> questionList, FloatingActionButton fab, CoordinatorLayout coordinator) {
    this.context = context;
    this.questionList = questionList;
    this.fabResult = fab;
    this.coordinator = coordinator;
  }


  @NonNull
  @Override
  public MbtiQuestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (layoutInflater == null) {
      layoutInflater = LayoutInflater.from(context);
    }

    QuesItemRowBinding binding = DataBindingUtil.inflate(layoutInflater,
      R.layout.ques_item_row, parent, false);

    return new MbtiQuestViewHolder(binding);
  }


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

    final Question question = questionList.get(position);
    holder.binding.setQuestion(question);

    //Fix the select the radio Button when first Select 8th and... do not selected



    //************************************************************


    //Check if all question do not click do not allow go to the next page

    holder.binding.quesRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (holder.binding.firstQues.isChecked() || holder.binding.secondQues.isChecked()) {
          checkRadio++;

        } else {
//          snackbar = Snackbar.make(coordinator, R.string.choose_one_of_theme, Snackbar.LENGTH_INDEFINITE);
//          snackbar.show();
        }
      }
    });



   if (fabResult != null) {
      fabResult.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View v) {
                                       if (checkRadio == 60) {
                                         context.startActivity(new Intent(context, ResultActivity.class));

                                         totalScore = 0;
                                         for (int i = 0; i < 60; i++) {
                                           totalScore = totalScore + question.getScore();
                                           Log.i(TAG, "TotalScore: " + totalScore);
                                         }


                                         switch (totalScore) {
                                         }

                                       } else {
                                         snackbar = Snackbar.make(coordinator, R.string.check_all_ques_err, Snackbar.LENGTH_SHORT);
                                         snackbar.show();


                                       }
                                     }
                                   }

      );

      //*************************************************************



    }
  }


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

  public class MbtiQuestViewHolder extends RecyclerView.ViewHolder {

    private QuesItemRowBinding binding;

    public MbtiQuestViewHolder(QuesItemRowBinding binding) {
      super(binding.getRoot());
      this.binding = binding;

    }
  }


}

請幫幫我..我也添加了一些截圖...... tnx很多

我試過這段代碼但沒有奏效:

holder.binding.firstQues.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        question.setFirstChecked(holder.binding.firstQues.isChecked());
        holder.binding.firstQues.setChecked(holder.binding.firstQues.isChecked());

        question.setSecondChecked(false);
        holder.binding.secondQues.setChecked(false);
      }
    });

    holder.binding.secondQues.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        question.setFirstChecked(false);
        holder.binding.firstQues.setChecked(false);

        question.setSecondChecked(holder.binding.secondQues.isChecked());
        holder.binding.secondQues.setChecked(holder.binding.secondQues.isChecked());
      }
    });

    holder.binding.firstQues.setChecked(question.isFirstChecked());
    holder.binding.secondQues.setChecked(question.isSecondChecked());

在此處輸入圖片說明

在此處輸入圖片說明

您必須將選定的單選按鈕 ID 保留到您的模型中。

1> 在你的模型中選擇 selectedId。

class Model{
  int selctedId;
  // getter setter
}

2> 將此 ID 附加到您的無線電組。

@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
    Model model = list.get(position);
    holder.radioGroup.check(model.getSelectedId);
    holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
    {
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
         model.setSelectedId(checkedId);
        }
    });

在這個解決方案中,我們在模型中保存選定的 id,我們通過radioGroup.check(model.getSelectedId);將此字段附加到無線電組radioGroup.check(model.getSelectedId);

原因

當您不保留所選值時,它會在用戶滾動位置時被回收。

我也發現了一個相關的問題

久經考驗的解決方案

您正在使用數據綁定,因此上述解決方案可以更短。 使用雙向綁定來保存選定的 id。

項目.java

public class Item extends BaseObservable{
    private int selectedId;

    public int getSelectedId() {
        return selectedId;
    }

    public void setSelectedId(int selectedId) {
        this.selectedId = selectedId;
    }
}

行列表.xml

<data>

    <variable
        name="item"
        type="com.innovanathinklabs.sample.ui2.Item"/>

</data>

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:background="@color/colorPrimary"
    android:checkedButton="@={item.selectedId}"
    >

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbMale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="male"/>

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbFemale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="female"/>
</RadioGroup>

現在,當您需要獲取所選項目時。 然后這樣做。

if(list.get(1).getSelectedId() == R.id.rbMale){
 // male is selected
}
else if (list.get(1).getSelectedId() == R.id.rbMale){
 // female is selcted
}

同時從 Radio 組和 Radio 按鈕中刪除任何其他不必要的邏輯。

數據綁定魔法是

此代碼轉換為android:checkedButton="@={item.selectedId}"

 
 
 
  
  @Override public void onBindViewHolder(final CoachListViewHolder holder, final int position) { Model model = list.get(position); holder.radioGroup.check(model.getSelectedId); holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { model.setSelectedId(checkedId); } });
 
 

更新

這就是您在項目布局中綁定項目的方式。

holder.binding.setItem(list.get(position));

private int isFirstQuestionChecked = false添加到您的模型中,並在您選擇此RadioButton時更改它。 在您的適配器中顯示RadioButton正確值

if (element.isFirstQuestionChecked == true) {
    selectRadioButton()
} else {
    deselectRadioButton() // it's important!
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM