Измените элементы адаптера recyclerview из собственной активности после нажатия кнопки внутри адаптера - PullRequest
1 голос
/ 29 мая 2020

Я создал простое приложение для викторины с базой данных sqlite. Есть несколько заголовков викторины, а в заголовках этой викторины у нас есть несколько вопросов, которые отображаются в режиме ресайклера. Все вопросы имеют один заголовок, 4 ответа и один правильный ответ. Пользователь выбирает переключатель ответов и после этого нажимает кнопку подтверждения, которая расположена как элемент в нижней части представления ресайклера. Я могу простым способом поймать правильный ответ и отправить его в действие с помощью интерфейса. Но я хочу показать правильные и неправильные ответы с изменением цвета переключателей, но я не могу создать другой метод и изменить элементы держателя представления, потому что я не могу получить доступ к держателям представления вне метода onBindViewHolder. Я могу справиться с этим с другим адаптером. Я имею в виду, что могу создать поддельный адаптер, который просто показывает ответы. Это правильный путь?

Это мой код. Это немного неаккуратно. Извините за это

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());
    }
}

}

1 Ответ

2 голосов
/ 29 мая 2020

Создайте функцию в адаптере и отправьте держатель активности, вызвав эту функцию. сначала создайте Viewholder с именем holder1.

ViewHolder holder1;

затем в методе onBindViewHolder добавьте это:

holder1 = holder;

public ViewHolder getHolder(){
    return holder1;
}

теперь вы можете использовать его в своей деятельности следующим образом:

adapter.getHolder.rBtnAnswer1.setBackgroundColor(Color.parseColor("#FFFFFF")); //this is a example.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...