Android Hilighted/Selected items在RecyclerView中不可见时颜色会发生变化

Android Hilighted/Selected items在RecyclerView中不可见时颜色会发生变化,android,android-recyclerview,Android,Android Recyclerview,我有一个包含大量物品的RecyclerView。此RecyclerView具有用于无休止滚动的OnScrollListener 当选择一个项目时,我用特定的颜色和颜色突出显示它 取消选择时,颜色变为正常/白色 我面临的问题是,在我的视图中选择了几个可见的项目后,当我向上或向下滚动以选择更多的项目时,已选择项目的颜色将变为白色 我尝试在模型类中添加一个布尔变量(isSelected)并突出显示所选项,但仍然面临与前面相同的问题。目前,recyclerView只允许从视图中选择一个项目,经过一些

我有一个包含大量物品的RecyclerView。此RecyclerView具有用于无休止滚动的OnScrollListener

  • 当选择一个项目时,我用特定的颜色和颜色突出显示它
  • 取消选择时,颜色变为正常/白色
我面临的问题是,在我的视图中选择了几个可见的项目后,当我向上或向下滚动以选择更多的项目时,已选择项目的颜色将变为白色

我尝试在模型类中添加一个布尔变量(isSelected)并突出显示所选项,但仍然面临与前面相同的问题。目前,recyclerView只允许从视图中选择一个项目,经过一些研究后,我认为一些概念是从文章中提取出来的,用于实现单个项目选择。我想知道如何修改/调整此代码以能够选择多个项目

我不介绍代码,因为它是相当大的,是保密的,但如果有任何通用的修复方案,那么它会是什么

背景:该应用程序是一个聊天应用程序,我正在显示发送和接收的文本。用户应该能够选择一些特定的文本,并且应该能够与其他人共享

编辑:我正在将代码放入onBindViewHolder中:

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

        final PostDataColumns mPostDataColumns = data.get(position);

        holder.textCardView.setBackgroundColor(mPostDataColumns.isSelected() ? getResources().getColor(R.color.long_press):
                getResources().getColor(android.R.color.white));

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

                @Override
                public boolean onLongClick(View v) {

                    mPostDataColumns.setSelected(!mPostDataColumns.isSelected());

                    if(mPostDataColumns.isSelected()) {

                        holder.textCardView.setBackgroundResource(R.color.long_press);
                        multipleSelectedPositions.add(holder.getLayoutPosition());

                    } else if(!mPostDataColumns.isSelected()) {
                        holder.textCardView.setBackgroundResource(android.R.color.white);
                        multipleSelectedPositions.remove(holder.getAdapterPosition());
                    }

                    //Adapter.this.onLongClick(holder, position);

                    return true;
                }
            });
            holder.textCardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    holder.textCardView.setBackgroundResource(android.R.color.white);

                    /* clearLongSelection(holder, position, alignParentRight,
                            data.get(position).getReceiverUserId().length() > 5); */
                }
            });
}
我在onCLick和onLongClick中注释的代码是在要求选择单个项目时使用的

以下是在onClick和onLOngClick中调用的方法:

public boolean clearLongSelection(ViewHolder holder, int position) {
        if (selectedPosition >= 0) {
            if (selectedPosition == position) {
                holder.parentLayout.setBackgroundResource(android.R.color.transparent);
                if (alignParentRight) {
                    holder.mediaCardView.setBackgroundResource(android.R.color.white);
                    holder.assessmentCardView.setBackgroundResource(android.R.color.white);
                    holder.surveyCardView.setBackgroundResource(android.R.color.white);
                    holder.documentCardView.setBackgroundResource(android.R.color.white);
                    holder.textCardView.setBackgroundResource(android.R.color.white);
                } else {
                    holder.mediaCardView.setBackgroundResource(R.color.long_press);
                    holder.assessmentCardView.setBackgroundResource(R.color.long_press);
                    holder.surveyCardView.setBackgroundResource(R.color.long_press);
                    holder.documentCardView.setBackgroundResource(R.color.long_press);
                    holder.textCardView.setBackgroundResource(R.color.long_press);
                }
                selectedPosition = -1;
                invalidateOptionsMenu();
                getSupportActionBar().setTitle(intentData.getName());
            }
            return true;
        }
        return false;
    }

    public void onLongClick(ViewHolder holder, int position) {
        if (selectedPosition < 0) {
            holder.parentLayout.setBackgroundResource(R.color.long_press);
            holder.mediaCardView.setBackgroundResource(R.color.long_press);
            holder.assessmentCardView.setBackgroundResource(R.color.long_press);
            holder.surveyCardView.setBackgroundResource(R.color.long_press);
            holder.documentCardView.setBackgroundResource(R.color.long_press);
            holder.textCardView.setBackgroundResource(R.color.long_press);
            selectedPosition = position;
            invalidateOptionsMenu();
            getSupportActionBar().setTitle("1 Selected");
        } else {

        }

    }
public boolean clearLongSelection(视图持有者,int位置){
如果(selectedPosition>=0){
如果(selectedPosition==位置){
holder.parentLayout.setBackgroundResource(android.R.color.transparent);
如果(右对齐){
holder.mediaCardView.setBackgroundResource(android.R.color.white);
holder.assessmentCardView.setBackgroundResource(android.R.color.white);
holder.surveyCardView.setBackgroundResource(android.R.color.white);
holder.documentCardView.setBackgroundResource(android.R.color.white);
holder.textCardView.setBackgroundResource(android.R.color.white);
}否则{
mediaCardView.setBackgroundResource(R.color.long_press)支架;
持有者。评估卡片视图。挫折背景资源(R.color。long_出版社);
持有人。调查卡德维。挫折资源(R.color。long_出版社);
holder.documentCardView.setBackgroundResource(R.color.long_出版社);
holder.textCardView.setBackgroundResource(R.color.long_press);
}
selectedPosition=-1;
无效操作菜单();
getSupportActionBar().setTitle(intentData.getName());
}
返回true;
}
返回false;
}
仅长按公共无效(视图持有者,内部位置){
如果(所选位置<0){
holder.parentLayout.setBackgroundResource(R.color.long_出版社);
mediaCardView.setBackgroundResource(R.color.long_press)支架;
持有者。评估卡片视图。挫折背景资源(R.color。long_出版社);
持有人。调查卡德维。挫折资源(R.color。long_出版社);
holder.documentCardView.setBackgroundResource(R.color.long_出版社);
holder.textCardView.setBackgroundResource(R.color.long_press);
selectedPosition=位置;
无效操作菜单();
getSupportActionBar().setTitle(“选择1”);
}否则{
}
}

onClick和clearLongSelection中的变量selectedPosition在类中初始化为实例变量-selectedPosition=-1

使用SparseBooleanArray跟踪回收器视图适配器中的选定项目

将SparseBooleanArray初始化为私有memeber变量

private SparseBooleanArray mClickedItems=new SparseBooleanArray();
然后在单击任何项目时,在单击函数中,将单击的项目位置存储为true

mClickedItems.put(getAdapterPosition(),true);
notifyDataSetChanged();
然后在onBindViewHolder中检查是否已选择该位置,是否与此类似

if(mClickedItems.get(position)==true){
   //Show selected color
}else {
  //show unselected color
}

使用SparseBooleanArray跟踪回收器视图适配器中的选定项目

将SparseBooleanArray初始化为私有memeber变量

private SparseBooleanArray mClickedItems=new SparseBooleanArray();
然后在单击任何项目时,在单击函数中,将单击的项目位置存储为true

mClickedItems.put(getAdapterPosition(),true);
notifyDataSetChanged();
然后在onBindViewHolder中检查是否已选择该位置,是否与此类似

if(mClickedItems.get(position)==true){
   //Show selected color
}else {
  //show unselected color
}

发布你的代码?检查这个。按钮颜色在单击时更改。类似的机制也可用于背景色单选或多选?@KeLiuyue multiple choicepost您的代码?检查此项。按钮颜色在单击时更改。类似的机制也可用于背景色单选或多选?@KeLiuyue multiple-choice