处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中相关的知识,希望对你有一定的参考价值。
我正在设计在线测验App。我设计了PlayQuiz.java文件如下:
public class PlayQuiz extends AppCompatActivity {
private RecyclerView recyclerView;
DataBaseHelper database;
private List<DmQuiz> quizList;
private QuizAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_quiz);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView=(RecyclerView)findViewById(R.id.recycler_view_quiz_display);
database= new DataBaseHelper(PlayQuiz.this);
quizList= database.fillObjQuesList();
adapter=new QuizAdapter(quizList,getApplicationContext());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
});
}
}
现在,这是我的QuizAdapter.java文件
public class QuizAdapter extends RecyclerView.Adapter<QuizAdapter.CustomViewHolder>{
private List<DmQuiz> questionList;
private Context context;
public QuizAdapter(List<DmQuiz> questionList, Context context) {
this.questionList = questionList;
this.context = context;
}
@NonNull
@Override
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.quiz_display_format,parent,false);
return new CustomViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final CustomViewHolder holder, final int position) {
DmQuiz questionsList=questionList.get(position);
holder.tvquestion.getLayoutParams().width= LinearLayout.LayoutParams.WRAP_CONTENT;
holder.tvquestion.setText(questionsList.getQuestion());
holder.optA.setText(questionsList.getOpta());
holder.optB.setText(questionsList.getOptb());
holder.optC.setText(questionsList.getOptc());
holder.optD.setText(questionsList.getOptd());
holder.optA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.optA.setBackgroundColor(context.getResources().getColor(R.color.colorButton));
holder.optA.setBackgroundResource(R.drawable.button_border); holder.optB.setBackgroundResource(R.drawable.button_border_unselected); holder.optC.setBackgroundResource(R.drawable.button_border_unselected); holder.optD.setBackgroundResource(R.drawable.button_border_unselected);
}
});
holder.optB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
holder.optB.setBackgroundResource(R.drawable.button_border);
holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
holder.optD.setBackgroundResource(R.drawable.button_border_unselected);
}
});
holder.optC.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
holder.optC.setBackgroundResource(R.drawable.button_border);
holder.optD.setBackgroundResource(R.drawable.button_border_unselected);
}
});
holder.optD.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
holder.optD.setBackgroundResource(R.drawable.button_border);
}
});
holder.tvClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
holder.optD.setBackgroundResource(R.drawable.button_border_unselected);
}
});
}
@Override
public int getItemCount() {
return questionList.size();
}
public class CustomViewHolder extends RecyclerView.ViewHolder{
TextView tvquestion, tvClear;
Button optA,optB,optC,optD;
public CustomViewHolder(View itemView) {
super(itemView);
tvquestion=(TextView)itemView.findViewById(R.id.tvQuestion);
optA=(Button)itemView.findViewById(R.id.button1);
optB=(Button)itemView.findViewById(R.id.button2);
optC=(Button)itemView.findViewById(R.id.button3);
optD=(Button)itemView.findViewById(R.id.button4);
tvClear=(TextView)itemView.findViewById(R.id.tvClear);
}
}
public QuizAdapter(List<DmQuiz> questionList)
{
this.questionList=questionList;
}
public void setSearchOperation(List<DmQuiz> newList){
questionList= new ArrayList<>();
questionList.addAll(newList);
notifyDataSetChanged();
}
}
Recyclerview中的数据正在从SQLite数据库中显示。
现在我想处理/存储多个按钮上的点击并将其发送到远程mysql服务器。我很困惑,如何存储不同问题的回复?我应该使用ArrayList或其他东西,请帮助......
如果你用通用的选项列表创建一个问题会更好,所以测验模型会是这样的:
public class DmQuiz {
int id;
String question;
String answer;
int selectedOptionId;
List<Options> options;
}
和期权模型将是:
public class Option {
int id;
String option;
boolean isSelected;
}
之后,您可以在每个问题项中创建另一个回收站视图并填充选项,每次用户单击其中一个选项时,您可以将这些点击委托回活动以使用新答案处理问题。
在你的DmQuiz
模型中添加一个questionId
和selectedOption
字段,可帮助您确定问题的正确答案,然后在onBindViewHolder()
中针对所选选项设置单选按钮并使其他人不受控制。另外,将侦听器添加到单选按钮,将selectedOption
设置为questionId
。每当您想要将测验上传到服务器时,您可以根据远程服务器要求遍历列表来创建单独的列表。
请参考下面的DmQuiz模型..
class DmQuiz {
//unique id per question
int id;
String question;
String answer;
String opta;
String optb;
String optc;
String optd;
}
在这里,你可以使用id
作为一个独特的问题id和answer
作为选择,即“a”/“b”/“c”/“d”等,所以在你只需要遍历这个List<DmQuiz>
并创建一个HashMap<String, String>
(或者等价于维持(key = value)对)(“id”=>“answer”)。
以上是关于处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中的主要内容,如果未能解决你的问题,请参考以下文章
Android RecyclerView 项目在滚动时随机播放
Android 高性能列表:RecyclerView + DiffUtil