【问题标题】:Highlighted items are lost in recylerview when scroll in android在android中滚动时,高亮显示的项目在recyclerview中丢失
【发布时间】:2021-10-15 12:49:03
【问题描述】:

我在 recylerview 中有一个项目列表。我在点击时突出显示项目,但问题是当我滚动时这些项目的突出显示状态会丢失。我环顾了很多解决方案,但问题仍然存在。当您在滚动后单击这些项目时,列表的大小会减小,因为它应该只有高亮状态消失。

public void onBindViewHolder (@NonNull MyAdapter.MyViewHolder holder, int position) {

    MyFiles item = myFiles.get(position);

    if (item.isHighlighted()) {

        // change to desired color
        item.setHighlighted(true);
        holder.itemView.setBackgroundColor(activity.getResources().getColor(R.color.grey));

    } else {
        // change to default color
        item.setHighlighted(false);
        holder.itemView.setBackgroundColor(activity.getResources().getColor(R.color.white));
    }

    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            if (!isModeEnabled) {
                
                // highlight item here
                item.setHighlighted(!item.isHighlighted());
                isActionModeEnabled = true;
                Highlight(holder);
            }
            
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (isActionModeEnabled) {
                        
                        // highlight item here 
                        item.setHighlighted(!item.isHighlighted());                      
                        Highlight(holder);
                    }
                }
            }
        }
        
        @Override
        public int getItemViewType(int position) {
            return position;
        }
        
        public void Highlight(MyViewHolder holder) {
        isSelectMode = true;
        
        MyFiles files = myFiles.get(holder.getAdapterPosition());
        if (!selectList.contains(files)){
            selectList.add(files);
        } else {
            selectList.remove(files);
        }
    }
}

public class MyFiles{
    
    public long id;
    public String path;
    private boolean isHighlighted = false;
    
    public boolean isHighlighted() {
        return isHighlighted;
    }
    
    public void setChecked(boolean isHighlighted) {
        this.isHighlighted = isHighlighted;
    }
    
    public MyFiles(Long id, String title, boolean isHighlighted) {
        this.id = id;
        this.title = title;
        this.isHighlighted = isHighlighted;
    }
}

有人可以帮忙吗?谢谢!

【问题讨论】:

  • 覆盖getItemViewType 方法。 @Override public int getItemViewType(int position) { return position; }
  • 我编辑了上面的代码,但是滚动后高亮状态仍然消失了。
  • 很少有项目丢失突出显示状态?还是所有选定的项目?
  • 所有选择的项目。
  • 如果您的项目开源,您可以分享 git,或者如果您愿意,您可以在社交媒体中收件我完整的项目。很抱歉,我没有根据附加的代码找出问题。

标签: android-recyclerview highlight items


【解决方案1】:

将“boolean highlighted”添加到您的“MyFiles”类和您突出显示项目集“highlighted = true”的侦听器中。这样,您将获得每个项目的信息,无论它是否突出显示,并做出相应的反应。如果您只是通过某些操作为项目着色,但不存储有关它正在完成的信息,则实际上无法知道哪个项目被突出显示。

进一步澄清:在您的持有人中,您应该做类似的事情

if(item.isHighlighted()){
   // change to desired color
}else{
   // change to default color
}

在你的 onItemClick 中:

item.setHighlighted(!item.isHighlighted());

编辑:

通常在处理回收站视图时,您希望有一个活动,其中包含您要查看的所有项目的列表。一旦该列表存在,您将其传递给适配器。

在适配器内部有一个支架,您可以使用它来格式化您的 recyclerView 的外观。在这里,您将根据天气项目已突出显示 = true 或 false 来更改特定项目的颜色。

在适配器内的 onclickListener 上,您将更改突出显示的状态(如果为真,则为假,如果为假,则为真)。

更改项目状态后,该更改必须应用于传递给适配器的原始列表,否则您始终拥有原始列表。

【讨论】:

  • 感谢您的回答,我尝试按照您的要求进行操作,但这些项目现在甚至没有突出显示。我已将整个代码与模型类一起放在上面。如果您能在这里找到问题所在,对我有很大帮助。
  • 您是否使用数据库或类似的东西来存储每个 MyFiles 实例的值?因为必须存储每个项目的状态/更改才能在之后读取。
  • 我正在使用数据库但不在此活动中,上述实现是否正确?
  • 很难理解你想要实现的目标,也很难像这样在你的代码中寻找潜在的问题。尝试评论您的代码(在代码块中添加描述,说明您想用它实现什么)并将其发布在某个地方以便于查看。
  • 我只想在第一次长按时突出显示项目,仅在启用操作模式时,然后在单击时突出显示它们并在再次单击该项目时反转它。
猜你喜欢
  • 2021-12-15
  • 2022-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2023-04-03
相关资源
最近更新 更多