java - 计算每个 recyclerview 项目的 int 值,并在活动完成时加起来
问题描述
我正在制作一个多项选择应用程序,其中问题通过arraylist 显示在recyclerview 中。还有用于选择答案的按钮。并从 sqlite 获得正确的答案,并根据用户输入的答案执行 if 条件以计算每个问题的分数。像这样....
我的问题是当单击完成按钮(即在主要活动中)时,我不知道如何使用用户输入计算标记(单击按钮 bta1 true、bta1 false 等....)。我想计算每个问题的分数,每个问题总共5分。如果我点击完成按钮并且如果有 10 个问题并且所有用户输入的答案都是正确的,那么总分应该是 50 分。
这是我的 recyclerview 适配器类
public class Rvadapter extends RecyclerView.Adapter <Rvadapter.MyViewHolder> {
private Context context;
Activity activity;
MyDatabaseHelper myDB;
String questiontitle, question1, question2, question3, question4, question5, answer1, answer2, answer3, answer4, answer5;
String answerdb1, answerdb2, answerdb3, answerdb4, answerdb5;
Cursor cursor;
ArrayList<ItemList> arlist;
int marks, totalmark;
private ArrayList arquestiontitle, arquestion1, arquestion2, arquestion3, arquestion4, arquestion5, aranswer1, aranswer2, aranswer3, aranswer4, aranswer5, armarks;
String idtosee, orderid, orderdate, customername, customeraddress, customerphone, delifee, advance, tax, discount, itemname, itemcount, itemprice, mark;
int a;
Rvadapter(Activity activity, Context context, ArrayList arquestiontitle, ArrayList arquestion1, ArrayList arquestion2, ArrayList arquestion3, ArrayList arquestion4, ArrayList arquestion5, ArrayList aranswer1, ArrayList aranswer2, ArrayList aranswer3, ArrayList aranswer4, ArrayList aranswer5, ArrayList armarks){
this.activity = activity;
this.context = context;
this.arquestiontitle = arquestiontitle;
this.arquestion1 = arquestion1;
this.arquestion2 = arquestion2;
this.arquestion3 = arquestion3;
this.arquestion4 = arquestion4;
this.arquestion5 = arquestion5;
this.aranswer1 = aranswer1;
this.aranswer2 = aranswer2;
this.aranswer3 = aranswer3;
this.aranswer4 = aranswer4;
this.aranswer5 = aranswer5;
this.armarks = armarks;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.cardlayoutquestion, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
holder.tvquestiontitle.setText(String.valueOf(arquestiontitle.get(position)));
holder.tvquestion1.setText(String.valueOf(arquestion1.get(position)));
holder.tvquestion2.setText(String.valueOf(arquestion2.get(position)));
holder.tvquestion3.setText(String.valueOf(arquestion3.get(position)));
holder.tvquestion4.setText(String.valueOf(arquestion4.get(position)));
holder.tvquestion5.setText(String.valueOf(arquestion5.get(position)));
holder.tvquestionid.setText(String.valueOf(position+1+". "));
marks = Integer.parseInt(String.valueOf(armarks.get(position)));
answerdb1 = String.valueOf(aranswer1.get(position));
answerdb2 = String.valueOf(aranswer2.get(position));
answerdb3 = String.valueOf(aranswer3.get(position));
answerdb4 = String.valueOf(aranswer4.get(position));
answerdb5 = String.valueOf(aranswer5.get(position));
holder.bta1true.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(answer1 == null){
answer1 = "T";
holder.bta1true.setBackgroundResource(R.drawable.selected120);
holder.bta1false.setBackgroundResource(R.drawable.unselected120);
}else if ( answer1.equals("F")){
answer1 = "T";
holder.bta1true.setBackgroundResource(R.drawable.selected120);
holder.bta1false.setBackgroundResource(R.drawable.unselected120);
}else {
answer1 = null;
holder.bta1true.setBackgroundResource(R.drawable.unselected120);
}
}
});
holder.bta1false.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(answer1 == null){
answer1 = "F";
holder.bta1false.setBackgroundResource(R.drawable.selected120);
holder.bta1true.setBackgroundResource(R.drawable.unselected120);
}else if ( answer1.equals("T")){
answer1 = "F";
holder.bta1true.setBackgroundResource(R.drawable.unselected120);
holder.bta1false.setBackgroundResource(R.drawable.selected120);
}else {
answer1 = null;
holder.bta1false.setBackgroundResource(R.drawable.unselected120);
}
}
});
}
private void checkmarks() {
if(answer1!=null){
if(answer1.equals(answerdb1)){
marks++;
}else {
marks--;
}
}
if(answer2!=null){
if(answer2.equals(answerdb2)){
marks++;
}else{
marks--;
}
}
if(answer3!=null){
if(answer3.equals(answerdb3)){
marks++;
}else{
marks--;
}
}
if(answer4!=null){
if(answer4.equals(answerdb4)){
marks++;
}else{
marks--;
}
}
if(answer5!=null){
if(answer5.equals(answerdb5)){
marks++;
}else{
marks--;
}
}
if(marks<0){
marks=0;
}
}
@Override
public int getItemCount() {
return arquestiontitle.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView tvquestiontitle, tvquestion1, tvquestion2, tvquestion3, tvquestion4, tvquestion5, tvquestionid, tvmarks;
Button bta1true, bta1false, bta2true, bta2false, bta3true, bta3false, bta4true, bta4false, bta5true, bta5false;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tvquestiontitle = itemView.findViewById(R.id.tvquestiontitle);
tvquestion1 = itemView.findViewById(R.id.tvquestion1);
tvquestion2 = itemView.findViewById(R.id.tvquestion2);
tvquestion3 = itemView.findViewById(R.id.tvquestion3);
tvquestion4 = itemView.findViewById(R.id.tvquestion4);
tvquestion5 = itemView.findViewById(R.id.tvquestion5);
tvquestionid = itemView.findViewById(R.id.tvquestionid);
tvmarks = itemView.findViewById(R.id.tvmarks);
bta1true = itemView.findViewById(R.id.bta1true);
bta1false = itemView.findViewById(R.id.bta1false);
bta2true = itemView.findViewById(R.id.bta2true);
bta2false = itemView.findViewById(R.id.bta2false);
bta3true = itemView.findViewById(R.id.bta3true);
bta3false = itemView.findViewById(R.id.bta3false);
bta4true = itemView.findViewById(R.id.bta4true);
bta4false = itemView.findViewById(R.id.bta4false);
bta5true = itemView.findViewById(R.id.bta5true);
bta5false = itemView.findViewById(R.id.bta5false);
}
}
}
请帮助我...如何计算每个问题的分数(回收卡视图项目)并将所有这些汇总在一起。我可以通过下一个按钮一次只用一个问题来获得它们,但这次我想展示recyclerview中的所有问题..
解决方案
改用复选框
首先。如果用户输入(在这种情况下为答案)是布尔类型,那么您应该使用复选框而不是按钮(更容易处理)。
布局看起来像这样:
如果你愿意,你可以坚持使用按钮
创建一个类来存储答案
然后创建一个类来存储答案(让我们称之为“答案”)public class Answer {
private int questionNumber;//number of the question
private Boolean bta1, bta2, bta3, bta4, bta5;//answers
public Answer() {
}
public Answer(int questionNumber, Boolean bta1, Boolean bta2, Boolean bta3, Boolean bta4, Boolean bta5) {
this.questionNumber = questionNumber;
this.bta1 = bta1;
this.bta2 = bta2;
this.bta3 = bta3;
this.bta4 = bta4;
this.bta5 = bta5;
}
public int getQuestionNumber() {
return questionNumber;
}
public void setQuestionNumber(int questionNumber) {
this.questionNumber = questionNumber;
}
public Boolean getBta1() {
return bta1;
}
public void setBta1(Boolean bta1) {
this.bta1 = bta1;
}
public Boolean getBta2() {
return bta2;
}
public void setBta2(Boolean bta2) {
this.bta2 = bta2;
}
public Boolean getBta3() {
return bta3;
}
public void setBta3(Boolean bta3) {
this.bta3 = bta3;
}
public Boolean getBta4() {
return bta4;
}
public void setBta4(Boolean bta4) {
this.bta4 = bta4;
}
public Boolean getBta5() {
return bta5;
}
public void setBta5(Boolean bta5) {
this.bta5 = bta5;
}
}
为每个问题创建一个对象
并为 MainActivity 中的每个问题创建对象public class MainActivity extends AppCompatActivity {
ArrayList<Answer> answers = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeAnswers();
.
.
.
}
// here we create object for each question and make it default value all false
public void initializeAnswers(){
for (int i=1;i<=20;i++){//replace 20 with how many questions you have
answers.add(new Answer(i,false,false,false,false,false));
}
}
// this is the methode that will be called when the user press a checkbox(change its value)
public void setQuestionResult(int questionNumber, int optionNumber, boolean value){
switch (optionNumber){
case 1:
answers.get(questionNumber+1).setBta1(value);
break;
case 2:
answers.get(questionNumber+1).setBta2(value);
break;
case 3:
answers.get(questionNumber+1).setBta3(value);
break;
case 4:
answers.get(questionNumber+1).setBta4(value);
break;
case 5:
answers.get(questionNumber+1).setBta5(value);
break;
}
}
}
捕捉用户输入
之后,我们将为 recyclerview 项目中的每个按钮(或复选框)设置点击侦听器,因此当用户选择答案时,我们将其存储在我们之前创建的对象中。我们将在 `ViewHolder` 中执行此操作class MyViewHolder extends RecyclerView.ViewHolder {
int questionNumber;
TextView tvquestiontitle, tvquestion1, tvquestion2, tvquestion3, tvquestion4, tvquestion5, tvquestionid, tvmarks;
CheckBox bta1, bta2, bta3, bta4, bta5;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tvquestiontitle = itemView.findViewById(R.id.tvquestiontitle);
tvquestion1 = itemView.findViewById(R.id.tvquestion1);
tvquestion2 = itemView.findViewById(R.id.tvquestion2);
tvquestion3 = itemView.findViewById(R.id.tvquestion3);
tvquestion4 = itemView.findViewById(R.id.tvquestion4);
tvquestion5 = itemView.findViewById(R.id.tvquestion5);
tvquestionid = itemView.findViewById(R.id.tvquestionid);
tvmarks = itemView.findViewById(R.id.tvmarks);
bta1 = itemView.findViewById(R.id.bta1);
bta2 = itemView.findViewById(R.id.bta2);
bta3 = itemView.findViewById(R.id.bta3);
bta4 = itemView.findViewById(R.id.bta4);
bta5 = itemView.findViewById(R.id.bta5);
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Is the view now checked?
boolean checked = ((CheckBox) v).isChecked();
int optionNumber;// e.g "1 is A" "2 is B" etc..
//get option number form the view id
switch (v.getId()) {
case R.id.bta1:
optionNumber = 1;
break;
case R.id.bta2:
optionNumber = 2;
break;
case R.id.bta3:
optionNumber = 3;
break;
case R.id.bta4:
optionNumber = 4;
break;
case R.id.bta5:
optionNumber = 5;
break;
default:
optionNumber = 0;
}
// here we will pass the changes to setQuestionResult to the Activity to process it
((MainActivity)context).setQuestionResult(questionNumber,optionNumber,checked);
}
};
bta1.setOnClickListener(onClickListener);
bta2.setOnClickListener(onClickListener);
bta3.setOnClickListener(onClickListener);
bta4.setOnClickListener(onClickListener);
bta5.setOnClickListener(onClickListener);
}
}
您可能会意识到我在顶部 ( int questionNumber;
) 中添加了一个参数,这将确定我们正在处理的问题。
您还需要在 中为此参数设置一个值onBindViewHolder
。
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
holder.questionNumber = position+1;//add one because the position of the first item is 0
.
.
.
}
计算每个问题的分数
最后。当你想计算一个问题的分数时,结果会被存储起来answers
,只需调用它即可
answers.get(questioNumber+1)//add one because the index always start from 0
最后一件事。在 recyclerview 中更改项目状态时可能会遇到问题,因此当您向下滚动第一个项目时,第一个项目变得不可见并且 recyclerview回收这些项目,因此发生的任何更改(例如选中复选框)都将丢失,并且项目将重置为第一个状态。
如果发生这种情况,请检查此解决方案
更新
正如我之前提到的,如果需要,您仍然可以使用按钮或任何您觉得更好的输入类型来完成。您唯一需要更改的是捕获用户输入的方式。
例如,如果您使用按钮,您将有 3 个可能的输入:
- 真的。如果按下 btn1 而未按下 btn2
- 错误的。如果 bot 中的 btn1 被按下 bur btn2 被按下
- 两者都不。如果没有按下 btn1 和 btn2
您可以使用布尔类型来存储输入,null
方法是当值既不为真也不为假(例如bta1=null
)
这种方法的问题在于它非常复杂和令人困惑(但仍然可能)
所以。我的建议是使用 3 个雕像复选框。
这是一个第三方库女巫,您可以将其添加到您的项目中。
它几乎是一个包含三个统计信息的复选框
- 已检查
- 未选中
- 不定
推荐阅读
- sql - 将 CSV 导入 SQL Server 数据库时遇到问题
- java - 如何在一个应用程序中配置 2 个具有普通用户(都可以访问它们)的数据库?
- git - 如何让 VSCode 远程容器读取 ssh 配置文件?
- javascript - 如何在 Chrome 中使用 Masonry 和“columnWidth”?
- go - 客户端无法开始与服务器握手并返回 nil(未找到“升级”令牌)
- c# - C#:如何在 Blazor Wasm 托管中将动态 Razor 组件从服务器发送到客户端?
- angular - 如何在 Angular 中返回上一页?
- python - 将行转换为 DateTime DataTypes Pandas Dataframe
- python - json文件的消失部分
- python - 使用 apply 计算大量附加列 pandas 数据框