我有一个包含大量项目的RecyclerView。这个RecyclerView有OnScrollListener用于无休止的滚动。
我面临的问题是,当我向上或向下滚动以选择更多项目时,在我的视图中选择一些可见项目后,已选择项目的颜色将变为白色。
我尝试在模型类中添加一个布尔变量(isSelected)并突出显示所选项目但仍然面临与之前相同的问题。目前,recyclerView允许从视图中选择一个项目,经过一些研究后,我发现一些概念来自this文章,以实现单项选择。我想知道如何修改/调整此代码以便能够选择多个项目。
我没有提供代码,因为它非常庞大并且是保密的,但如果对这种情况有任何一般修复,那会是什么?
背景:该应用程序是一个聊天应用程序,我正在显示已发送和已接收的文本。用户应该能够选择一些特定的文本,并且应该能够与其他人共享。
编辑:我将代码放在我的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 {
}
}
onClick和clearLongSelection中的变量selectedPosition在类中初始化为实例变量selectedPosition = -1。
答案 0 :(得分:0)
使用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
}