根据数据更改 Recycler View 项目

Posted

技术标签:

【中文标题】根据数据更改 Recycler View 项目【英文标题】:Changing Recycler View item based on its data 【发布时间】:2021-10-12 04:25:02 【问题描述】:

所以我有一个带有问题的 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;
        

这里的上下文是从活动中传递过来的,我必须想好要做什么。 我尝试将逻辑移除到构造函数,更改上下文,通过持有者寻址项目,并没有太大变化。

【问题讨论】:

【参考方案1】:

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

您的问题

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

解决方案

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

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;
    

【讨论】:

这完全有效。非常感谢。 不客气。您可以将答案标记为已接受,以表明问题已解决。

以上是关于根据数据更改 Recycler View 项目的主要内容,如果未能解决你的问题,请参考以下文章

为啥 onBindViewHolder 索引在 Recycler View 中没有增加?

Recycler View 不显示数据

Annotations Recycler View ItemClick

Recycler View 中的约束设置动画未正确设置动画

滚动 Recycler View 时有意丢失数据

Recycler View Android中的Firestore数据[重复]