RecyclerView и RadioButton в RadioGroup - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть RecyclerView и в макете RowItem у меня есть RadioGroup, и в них у меня есть два RadioButton.если я выберу первый элемент и прокрутите вниз, 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>

Question.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) {
  }
}

QuestionAdapter.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());

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы должны удерживать выбранный идентификатор переключателя для вашей модели.

1> Возьмите selectedId в вашей модели.

class Model{
  int selctedId;
  // getter setter
}

2> Прикрепите этот идентификатор к вашей радиогруппе.

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

В этом решении мы держим выбранный идентификатор в модели и присоединяем это поле к радиогруппе с помощью radioGroup.check(model.getSelectedId);

Причина

Если вы не удерживаете выбранное значение, оно перерабатывается, когда пользователь прокручивает позицию.

Я нашел связанный вопрос также.

Хорошо протестированное решение

Вы используете привязку данных, поэтому приведенное выше решение может быть более коротким. Используйте двустороннюю привязку для хранения выбранного идентификатора.

Item.java

public class Item extends BaseObservable{
    private int selectedId;

    public int getSelectedId() {
        return selectedId;
    }

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

row_list.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
}

Также удалите любую другую ненужную логику из группы Радио и кнопок радио.

Магия привязки данных

Этот код преобразуется в 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));
0 голосов
/ 11 сентября 2018

Добавьте private int isFirstQuestionChecked = false к вашей модели и меняйте ее всякий раз, когда вы выбираете эту RadioButton. В вашем адаптере покажите правильное значение для RadioButton

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