根据其数据更改 Recycler View 项目

Changing Recycler View item based on its data

所以我有一个带问题的 POJO,在我的回收站中我想显示一个问题本身和答案,正确答案应该有背景颜色。

当我尝试添加背景颜色时,项目会根据一些严肃的魔法着色。

前几件物品没有任何颜色,靠近回收器底部的地方就是这样。

enter image description here

越远越好,当我从底部滚动到顶部时,顶部的项目也会得到颜色。

        public void bind(Question question) {
        int correctAnswerNumber = question.getCorrectAnswer();

        switch (correctAnswerNumber) {
            case 1:
                answer1.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
                break;
            case 2:
                answer2.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
                break;
            case 3:
                answer3.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
                break;
            case 4:
                answer4.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
                break;
        }

}

这里的上下文是从activity传过来的,我得想办法了。 我尝试删除构造函数的逻辑,更改上下文,通过 holder 处理项目,但没有太大变化。

您有一个经典案例“来自回收视图项的陈旧状态”。

你的问题

您只设置了正确答案的背景。当该项目视图被回收并用于错误答案时,您不会更新它,它会保留设置在其上的旧背景。

解决方案

始终明确设置回收站项目视图的完整状态。在这种情况下,当它不是正确答案时,将背景设置为应有的样子。

public void bind(Question question) {
    int correctAnswerNumber = question.getCorrectAnswer();

    // Reset all backgrounds to default before setting the current correct one
    answer1.setBackground(getDefaultBackgroundBorder());
    answer2.setBackground(getDefaultBackgroundBorder());
    answer3.setBackground(getDefaultBackgroundBorder());
    answer4.setBackground(getDefaultBackgroundBorder());

    switch (correctAnswerNumber) {
        case 1:
            answer1.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
            break;
        case 2:
            answer2.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
            break;
        case 3:
            answer3.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
            break;
        case 4:
            answer4.setBackground(AppCompatResources.getDrawable(context, R.drawable.correct_answer_border));
            break;
    }
}