- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 MainActivity 方法中,checkAnswer 和 showSolution 必须修改,因为我将 RecycleView 适配器添加到项目并将所有 View 项移动到 QuestionAdapter。我不明白我应该如何在 QuestionAdapter 中使用 isChecked 检查 rbGroup 单选按钮的状态并将其 id 传递给 MainActivity。我试着检查一下:Radiogroup in recyclerview但我仍然不清楚下一步应该采取什么步骤。有人可以给我基本的指导,从现在开始修改我的项目应该采取什么步骤。仍然找不到在回收 View 中处理单选按钮列表的答案或教程。如何使用 MainActivity 的界面检查单选按钮状态?
按照建议进行了一些更新。不明白我应该如何修改 showSolution 方法。
public class MainActivity extends AppCompatActivity {
public QuestionAdapter adapter;
public ArrayList<Question> questionList;
private int questionCountTotal;
private long backPressedTime;
private int score;
private int questionCounter;
private Button btnConfirmNext;
private boolean answered;
private Question currentQuestion;
private TextView tvQuestion, tvScore, tvQuestionCount, tvCountdown;
public QuizDbHelper dbHelper;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnConfirmNext = findViewById(R.id.confirm_button);
tvCountdown = findViewById(R.id.count_down);
tvScore = findViewById(R.id.text_view_score);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
questionList = new ArrayList<>();
adapter = new QuestionAdapter(this, questionList);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 1);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
dbHelper = new QuizDbHelper(this);
questionList = dbHelper.getAllQuestions();
questionCountTotal = questionList.size();
Collections.shuffle(questionList);
prepareQuestion();
btnConfirmNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkAnswer();
}
});
}
private void prepareQuestion() {
adapter = new QuestionAdapter(getApplicationContext(), questionList);
recyclerView.setAdapter(adapter);
if (questionCounter < questionCountTotal) {
currentQuestion = questionList.get(questionCounter);
answered = false;
btnConfirmNext.setText("Confirm");
} else {
finishQuiz();
}
}
//How should I handle it in onbindViewHolder
private void checkAnswer() {
answered = true;
countDownTimer.cancel();
RadioButton rbSelected = findViewById(rbGroup.getCheckedRadioButtonId());
int answerNb = rbGroup.indexOfChild(rbSelected) + 1;
if (answerNb == currentQuestion.getAnswerNB()) {
score++;
tvScore.setText("Score: " + score);
}
showSolution();
}
//How should I change state of the items in recycle view
private void showSolution() {
rb1.setTextColor(Color.RED);
rb2.setTextColor(Color.RED);
rb3.setTextColor(Color.RED);
rb4.setTextColor(Color.RED);
switch (currentQuestion.getAnswerNB()) {
case 1:
rb1.setTextColor(Color.GREEN);
break;
case 2:
rb2.setTextColor(Color.GREEN);
break;
case 3:
rb3.setTextColor(Color.GREEN);
break;
case 4:
rb4.setTextColor(Color.GREEN);
break;
}
btnConfirmNext.setText("Finish");
}
问题适配器
public class QuestionAdapter extends RecyclerView.Adapter<QuestionAdapter.MyViewHolder> {
public ArrayList<Question> questionList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tvQuestion, tvScore, tvQuestionCount, tvCountdown;
public RadioGroup rbGroup;
public RadioButton rb1, rb2, rb3, rb4;
public MyViewHolder(View view) {
super(view);
tvQuestion = view.findViewById(R.id.question);
rbGroup = view.findViewById(R.id.radiog_group);
rb1 = view.findViewById(R.id.radio_button1);
rb2 = view.findViewById(R.id.radio_button2);
rb3 = view.findViewById(R.id.radio_button3);
rb4 = view.findViewById(R.id.radio_button4);
}
}
public QuestionAdapter(Context mContext, ArrayList<Question> questionList) {
this.questionList = questionList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.question_card, parent, false);
return new MyViewHolder(itemView);
}
@NonNull
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final Question question = questionList.get(position);
holder.tvQuestion.setText(question.getQuestion());
holder.rb1.setText(question.getOption1());
holder.rb2.setText(question.getOption2());
holder.rb3.setText(question.getOption3());
holder.rb4.setText(question.getOption4());
holder.rbGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
// How can I handle Check status here and pass it to main activity?
}
});
}
@Override
public int getItemCount() {
return questionList.size();
}
}
更新。 在向我的 QuestionAdapter 添加接口(interface)并对构造函数和其他部分进行更改后,我在 MainActivity 中的 checkAnswer 看起来像这样
private void checkAnswer() {
answered = true;
countDownTimer.cancel();
adapter = new QuestionAdapter(getApplicationContext(), questionList, new QuestionAdapter.OnItemListener() {
@Override
public void onItemSelect(int position) {
if (position+1==currentQuestion.getAnswerNB()){
score++;
tvScore.setText("Score: " + score);
}
}
});
showSolution();
}
现在我应该如何处理我的 showSolution 方法?似乎在 checkAnswer 之后我应该将信息发送回 QuestionAdapter 并在那里执行 setTextColor 。可能我走错了路......
最佳答案
你可以通过使用界面来做到这一点。
像这样创建一个接口(interface):
public interface OnItemListener {
public void onItemSelect(int position);
}
然后在您的适配器中像这样更改构造函数:
QuestionAdapter(Context mContext, ArrayList<Question> questionList, OnItemListener
onItemListener) {
this.onItemListener = onItemListener;
this.questionList = questionList;
}
并将这一行添加到您的 onCheckedChangeListener
onItemListener.onItemSelect(position);
像这样:
holder.rbGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
// How can I handle Check status here and pass it to main activity?
onItemListener.onItemSelect(position);
}
});
然后在你的 Activity 中添加这个你定义适配器的地方(这是定义适配器的另一种方式,你也可以使用你自己的方式只记得像这样添加接口(interface)(新的 OnItemListener ...)):
dbHelper = new QuizDbHelper(getApplicationContext(), questionList, new
OnItemListener({
@Override
public void onItemSelect(int position) {
// handle your check state of adapter item here
}
});
关于android - 检查 Recyclerview Adapter 中的单选按钮状态并从 MainActivity 对其应用更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520753/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!