JProgrammer
JProgrammer

Reputation: 95

Change recyclerview adapter items from own activity after clicking on button inside adapter

I built a simple quiz app with sqlite database There is some quiz headers and into this quiz headers we have some questions that show by recycler view. All questions have one question title and 4 answers and one correct answer. user chooses the radio button answers and after that click on confirm button that is located as item at the bottom of recycler view. I can catch the correct answer with a simple way and send it to the activity with an interface. But i want to show the correct and wrong answers with changing the radio buttons color but I can't create another method and change the view holder items because I can't access to the view holders outside of 'onBindViewHolder' method . I can handle this with another adapter . I mean I can create a fake adapter that just show answers . Is it a right way ?

This is my code. It's a little messy. Sorry about that

public class QuestionRecyclerAdapter extends RecyclerView.Adapter<QuestionRecyclerAdapter.ViewHolder> {

private Context context;
private List<QuestionHolder> questionHolders;
private OnQuestionAnswerSelect onQuestionAnswerSelect;
private OnConfirmButtonClicked onConfirmButtonClicked;

public QuestionRecyclerAdapter(Context context, List<QuestionHolder> questionHolders) {
    this.context = context;
    this.questionHolders = questionHolders;
}

public void setOnQuestionAnswerSelect(OnQuestionAnswerSelect onQuestionAnswerSelect) {
    this.onQuestionAnswerSelect = onQuestionAnswerSelect;
}
public void setOnConfirmButtonClicked(OnConfirmButtonClicked onConfirmButtonClicked){
    this.onConfirmButtonClicked = onConfirmButtonClicked;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View itemView;

    if (viewType == R.layout.question_item)
        itemView = LayoutInflater.from(context).inflate(R.layout.question_item, parent, false);
    else
        itemView = LayoutInflater.from(context).inflate(R.layout.question_recycler_confirm_button, parent, false);

    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    if (position != questionHolders.size()) {
        QuestionModel currentModel = questionHolders.get(position).getQuestionModel();
        holder.txtQuestion.setText(currentModel.getTitle());

        holder.rBtnAnswer1.setText(currentModel.getOption1());
        holder.rBtnAnswer2.setText(currentModel.getOption2());
        holder.rBtnAnswer3.setText(currentModel.getOption3());
        holder.rBtnAnswer4.setText(currentModel.getOption4());

        if (onQuestionAnswerSelect != null) {

            holder.questionRadioGroup.setOnCheckedChangeListener((v, i) -> {
                RadioButton rBtnSelected = holder.questionRadioGroup.findViewById(holder.questionRadioGroup.getCheckedRadioButtonId());
                int selectedRadioIndex = holder.questionRadioGroup.indexOfChild(rBtnSelected) + 1;

                if (selectedRadioIndex == questionHolders.get(position).getQuestionModel().getCorrectNumber()) {
                    onQuestionAnswerSelect.onAnswerSelected(questionHolders.get(position).get_id(), true);
                } else {
                    onQuestionAnswerSelect.onAnswerSelected(questionHolders.get(position).get_id(), false);
                }
            });
        }
    }else {
        holder.btnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onConfirmButtonClicked != null)
                    onConfirmButtonClicked.onConfirmClicked();
            }
        });
    }
}

@Override
public int getItemCount() {
    return questionHolders.size() + 1;
}

@Override
public int getItemViewType(int position) {
    return (position == questionHolders.size()) ? R.layout.question_recycler_confirm_button : R.layout.question_item;
}


public class ViewHolder extends RecyclerView.ViewHolder {


    public TextView txtQuestion;
    public RadioGroup questionRadioGroup;
    public RadioButton rBtnAnswer1;
    public RadioButton rBtnAnswer2;
    public RadioButton rBtnAnswer3;
    public RadioButton rBtnAnswer4;
    public Button btnConfirm;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        txtQuestion = itemView.findViewById(R.id.txtQuestion);
        questionRadioGroup = itemView.findViewById(R.id.questionRadioGroup);
        rBtnAnswer1 = itemView.findViewById(R.id.rBtnAnswer1);
        rBtnAnswer2 = itemView.findViewById(R.id.rBtnAnswer2);
        rBtnAnswer3 = itemView.findViewById(R.id.rBtnAnswer3);
        rBtnAnswer4 = itemView.findViewById(R.id.rBtnAnswer4);
        btnConfirm = itemView.findViewById(R.id.btnConfirm);
    }
}

}

public class QuizActivity extends AppCompatActivity {

RecyclerView questionRecyclerView ;
QuestionRecyclerAdapter adapter ;
QuestionDatabaseHelper questionDatabaseHelper ;
Map<Integer,Boolean> answeredRecords = new HashMap<>();

int score ;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);

    questionRecyclerView = findViewById(R.id.questionRecyclerView);
    questionDatabaseHelper = new QuestionDatabaseHelper(this);

    int selectedId = getIntent().getIntExtra(Constants.SELECTED_ID,0);
    score = 0 ;

    List<QuestionHolder> questionHolders = questionDatabaseHelper.getAllQuestionHoldersById(selectedId);
    adapter = new QuestionRecyclerAdapter(this,questionHolders);
    questionRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    questionRecyclerView.setAdapter(adapter);

    adapter.setOnQuestionAnswerSelect(new OnQuestionAnswerSelect() {
        @Override
        public void onAnswerSelected(int questionNumber, boolean isCorrect) {
            answeredRecords.put(questionNumber,isCorrect);
        }
    });
    adapter.setOnConfirmButtonClicked(new OnConfirmButtonClicked() {
        @Override
        public void onConfirmClicked() {
            score = 0 ;
            for(Map.Entry<Integer,Boolean> item : answeredRecords.entrySet()){
                if (item.getValue())
                    score++;
            }
            Log.e("THE SCORE IS ", String.valueOf(score));
        }
    });
}
private void displayRecords(){

    for(Map.Entry<Integer,Boolean> item : answeredRecords.entrySet()){
        Log.e("AAA",item.getKey() + " : " + item.getValue());
    }
}

}

Upvotes: 1

Views: 856

Answers (1)

tohid noori
tohid noori

Reputation: 221

Make a function in adapter and send holder to activity by calling that function. first make viewholder named holder1.

ViewHolder holder1;

then at the onBindViewHolder method add this:

holder1 = holder;

public ViewHolder getHolder(){
    return holder1;
}

now you can use it in your Activity like this:

adapter.getHolder.rBtnAnswer1.setBackgroundColor(Color.parseColor("#FFFFFF")); //this is a example.

Upvotes: 2

Related Questions