java - 当由 recyclerView 填充时,如何检查所有无线电组是否都有选定的答案?
问题描述
我只写了几个月的代码,对于很多技术我还是个新手,但我正在为我 5 岁的儿子做一个数学训练测验。我一直在尝试一些不同的“游戏”来玩和挑战自己。我昨天完成了计时赛,上周完成了模式比赛,但现在我被困在当前的游戏中,这是一个关卡挑战。玩家必须正确回答 10 个问题才能进入下一个级别(问题变得越来越难)。
我正在使用 RecyclerView 创建问题。每个问题都填充了随机整数,并且可以选择可能的答案作为 RadioButtons。
到目前为止,我已经能够弄清楚如何添加格式和更新 ViewHolder,但现在我坚持尝试在我的 Fragment 中创建一个方法来检查所有已回答的问题。我相信这必须在 Fragment 中完成,因为 Fragment 是我定义要创建多少个问题以及生成随机数并将其传递到 Recycler Adapter 用于更新 View Holder 的 ArrayList 的地方。
我希望我能很好地解释自己,所以我的问题是如何检查所有无线电组是否满足以下参数:
- 有一个选定的单选按钮
- 回答正确(如果回答错误,他们将不会进入下一个级别,而是会获得一组新的相同难度的问题。
这是我的片段类:
public class FragmentLevelChallenge extends Fragment{
public static final String TAG = "LevelChallengeFragment";
RecyclerView recyclerView;
RVAdapterMulti adapterMulti;
private List<multiquestion> QuestionsMulti;
int firstDig;
int secondDig;
int correctAnswer;
int incorrectOne;
int incorrectTwo;
int incorrectThree;
int thisPosition;
int selectedAnswers;
int questionsAnswered;
//levelChallenge defines the current challenge level
int levelChallenge;
int maxBound = 10;
int minBound = 1;
int adjustBound = 1;
RadioGroup radioGroupRecycler;
public static FragmentLevelChallenge newInstance() {
FragmentLevelChallenge fragment = new FragmentLevelChallenge();
return fragment;
}
@Override
public void onCreate (Bundle savedInstanceState) {super.onCreate(savedInstanceState);}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_level_challenge, container, false);
levelChallenge = 1;
QuestionsMulti = new ArrayList<>();
recyclerView = view.findViewById(R.id.recycler_view_display_multi);
radioGroupRecycler = view.findViewById(R.id.radio_group_multi);
LinearLayoutManager layoutManager = new LinearLayoutManager(view.getContext());
recyclerView.setLayoutManager(layoutManager);
TextView levelsText = view.findViewById(R.id.level_challenge);
levelsText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
initializeRecyclerAdapter();
createQuestionBatch();
return view;
}
private void createQuestionBatch() {
//Integer values to define the minimum, maximum and adjustment for random integers
if (selectedAnswers == 5) {
levelChallenge++;
}
//Checks the current level to determine the boundaries for difficulty of random integers
switch (levelChallenge) {
case 1: //If level 1 (bounds 10,1,1)
maxBound = 10;
minBound = 1;
adjustBound = 1;
break;
case 2: //If level 2 (bounds 20,1,4)
maxBound = 20;
minBound = 1;
adjustBound = 4;
break;
case 3: //If level 3 (bounds 25,10,5)
maxBound = 25;
minBound = 10;
adjustBound = 5;
break;
case 4: //If level 4 (bounds 30,10,7)
maxBound = 30;
minBound = 10;
adjustBound = 7;
break;
case 5: //If level 5 (bounds 50,10,9)
maxBound = 50;
minBound = 10;
adjustBound = 9;
break;
case 6: //If level 6 (bounds 75,10,15)
maxBound = 75;
minBound = 10;
adjustBound = 15;
break;
case 7: //If level 7 (bounds 100,10,18)
maxBound = 100;
minBound = 10;
adjustBound = 18;
break;
//If level 8 (bounds random integers?)
}
//Creates the random integers for math functions
int questionsToFillRecycler = 5;
for (int i = 0; i < questionsToFillRecycler; i++) {
final Random r = new Random();
Random position = new Random();
thisPosition = position.nextInt(4 - 1) + 1;
//Creates the array list for incorrect answers
firstDig = r.nextInt(maxBound - minBound) + adjustBound;
secondDig = r.nextInt(maxBound - minBound) + adjustBound;
if (firstDig < secondDig) {
correctAnswer = secondDig - firstDig;
incorrectOne = secondDig - firstDig - 1;
incorrectTwo = secondDig - firstDig + 2;
incorrectThree = (secondDig + firstDig) - 2;
} else {
correctAnswer = firstDig + secondDig;
incorrectOne = secondDig + firstDig - 2;
incorrectTwo = secondDig + firstDig + 1;
incorrectThree = (firstDig - secondDig) + 3;
}
//Convert integer to string values
String firstNumber = String.valueOf(firstDig);
String secondNumber = String.valueOf(secondDig);
String firstIncorrect = String.valueOf(incorrectOne);
String secondIncorrect = String.valueOf(incorrectTwo);
String thirdIncorrect = String.valueOf(incorrectThree);
String correct = String.valueOf(correctAnswer);
List<String> answers = new Vector<>();
answers.add(correct);
answers.add(firstIncorrect);
answers.add(secondIncorrect);
answers.add(thirdIncorrect);
Collections.shuffle(answers);
if (firstDig < secondDig) {
//Checks if 1st integer is less than 2nd integer
QuestionsMulti.add(new multiquestion(secondNumber, firstNumber, answers.get(0), "-", answers.get(1), answers.get(2), answers.get(3)));
} else if (firstDig > secondDig) {
//Checks if 1st integer is greater than 2nd integer
QuestionsMulti.add(new multiquestion(secondNumber, firstNumber, answers.get(0), "+", answers.get(1), answers.get(2), answers.get(3)));
} else {
//Checks if 1st integer is greater than 2nd integer
QuestionsMulti.add(new multiquestion(secondNumber, firstNumber, answers.get(0), "+", answers.get(1), answers.get(2), answers.get(3)));
}
//Updates the RecyclerView Adapter
adapterMulti.notifyDataSetChanged();
}
}
private void initializeRecyclerAdapter() {
adapterMulti = new RVAdapterMulti(QuestionsMulti);
recyclerView.setAdapter(adapterMulti);
}
}
这是我的 RecyclerAdapter:
public class RVAdapterMulti extends RecyclerView.Adapter<RVAdapterMulti.ViewHolder> {
private static String TAG = "RadioMultiAdapter";
private LayoutInflater inflater;
private List<multiquestion> QuestionsMulti;
private int questionsAnswered;
private AdapterView.OnItemSelectedListener onSelect;
public RVAdapterMulti(List<multiquestion> QuestionMulti) {
this.QuestionsMulti = QuestionMulti;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_multi, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
multiquestion currentQuestion = QuestionsMulti.get(position);
holder.setFirstDigit(currentQuestion.firstNumber);
holder.setSecondDigit(currentQuestion.secondNumber);
holder.setMathFunction(currentQuestion.mathFunc);
holder.setOptions(currentQuestion, position);
}
@Override
public int getItemCount() {
if (QuestionsMulti == null) {
return 0;
} else {
return QuestionsMulti.size();
}
}
class ViewHolder extends RecyclerView.ViewHolder {
private LinearLayout linearLayoutContainer;
private TextView firstDigitView;
private TextView secondDigitView;
private TextView mathFunctionView;
private TextView mathAnswerView;
private RadioGroup radioGroupOptions;
private RadioButton radioButtonOne, radioButtonTwo;
private RadioButton radioButtonThree, radioButtonFour;
public ViewHolder(View itemView) {
super(itemView);
firstDigitView = itemView.findViewById(R.id.first_digit);
secondDigitView = itemView.findViewById(R.id.second_digit);
mathFunctionView = itemView.findViewById(R.id.math_function);
mathAnswerView = itemView.findViewById(R.id.math_answer);
radioGroupOptions = itemView.findViewById(R.id.radio_group_multi);
radioButtonOne = itemView.findViewById(R.id.radio_button_one);
radioButtonTwo = itemView.findViewById(R.id.radio_button_two);
radioButtonThree = itemView.findViewById(R.id.radio_button_three);
radioButtonFour = itemView.findViewById(R.id.radio_button_four);
}
public void setFirstDigit(String firstDigit) {
firstDigitView.setText(firstDigit);
}
public void setSecondDigit(String secondDigit) {
secondDigitView.setText(secondDigit);
}
public void setMathFunction(String mathFunction) {
mathFunctionView.setText(mathFunction);
}
public void setOptions(final multiquestion question, int position) {
radioGroupOptions.setTag(position);
radioButtonOne.setText(question.correct);
radioButtonTwo.setText(question.incorrectOne);
radioButtonThree.setText(question.incorrectTwo);
radioButtonFour.setText(question.incorrectThree);
if (question.mathFunc.equals("+")) {
question.correctSolution = Integer.parseInt(question.firstNumber) + Integer.parseInt(question.secondNumber);
} else {
question.correctSolution = Integer.parseInt(question.firstNumber) - Integer.parseInt(question.secondNumber);
}
if(question.isAnswered) {
radioGroupOptions.check(question.checkedId);
} else {
radioGroupOptions.check(-1);
}
radioGroupOptions.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int pos = (int) group.getTag();
multiquestion que = QuestionsMulti.get(pos);
que.isAnswered = true;
que.checkedId = checkedId;
radioGroupOptions.setClickable(false);
radioButtonOne.setClickable(false);
radioButtonTwo.setClickable(false);
radioButtonThree.setClickable(false);
radioButtonFour.setClickable(false);
questionsAnswered = questionsAnswered + 1;
mathAnswerView.setText(String.valueOf(question.correctSolution));
String radioOneText = String.valueOf(radioButtonOne.getText());
String radioTwoText = String.valueOf(radioButtonTwo.getText());
String radioThreeText = String.valueOf(radioButtonThree.getText());
String radioFourText = String.valueOf(radioButtonFour.getText());
switch (que.checkedId) {
case R.id.radio_button_one:
if(radioOneText.equals(String.valueOf(question.correctSolution))) {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorCorrect));
} else {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorIncorrect));
}
break;
case R.id.radio_button_two:
if(radioTwoText.equals(String.valueOf(question.correctSolution))) {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorCorrect));
} else {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorIncorrect));
}
break;
case R.id.radio_button_three:
if(radioThreeText.equals(String.valueOf(question.correctSolution))) {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorCorrect));
} else {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorIncorrect));
}
break;
case R.id.radio_button_four:
if(radioFourText.equals(String.valueOf(question.correctSolution))) {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorCorrect));
} else {
mathAnswerView.setTextColor(group.getResources().getColor(R.color.colorIncorrect));
}
break;
}
}
});
}
}
}
任何帮助将不胜感激。
解决方案
最简单的方法是跟踪QuestionMulti
列表中的正确答案(您应该按照惯例将其重构为驼峰式)。multiquestion
向您的(应该是MultiQuestion
)类添加一个属性,answeredCorrectly
默认值为false
. 然后每次onCheckChanged
调用,在列表中的该位置设置值,并循环遍历列表以检查每个答案是否正确。
推荐阅读
- excel - 基于 Excel 列中的唯一值进行搜索
- amazon-web-services - 运行 Lambda 函数以使用 AppSync 和 DynamoDB 进行服务器端验证
- java - 根据查询更改firebase数据
- java - 遇到java.lang.StackOverflowError异常,调用方法时
- linux - 无法从源代码构建 y86-64 模拟器
- python - 我的计算正方形/矩形面积的代码有什么问题?
- keras - colab在查找目录和文件时出错
- c++ - 如何在向量数组中插入元素?
- sql - 从选择命令 [SQL] 中获取结果
- mongodb - Go mgo.v2 包错误:没有可访问的服务器