我有一个recyclerView,并在项目上实现了onLongClick
监听器。适配器与Activity位于同一类中。
我创建了一个集合public Set<Integer> multiplePositions
作为Activity类的实例变量,并在onCreate()方法中将其初始化为multiplePositions = new TreeSet<>()
。在onBindViewHolder
方法中转到我的Adapter类我创建了一个点击监听器,如下所示:
holder.textCardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Adapter.this.onLongClick(holder, position);
return true;
}
});
holder.textCardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
正如您所看到的,我正在调用onLongClick上的方法。我的onLongClick方法如下所示:
public void onLongClick(ViewHolder holder, int position) {
multiplePositions.add(position);
for(Integer i : multiplePositions) {
Log.e("set", ""+i);
}
holder.textCardView.setBackgroundResource(R.color.long_press);
}
在这里,每当点击一个项目时,我在Set中添加位置,但我不知道如何遍历此集合并设置集合中所有项目的背景颜色。
我知道这可以通过在模型类中创建一个布尔变量isSelected来实现,但如果我使用这个方法,那么我的代码的其他功能将无法工作。
我主要担心的是,如果我向上或向下滚动recyclerView,那么所选位置的颜色不应该消失。取消选择部分将在setOnClickListener()
中完成。
答案 0 :(得分:0)
使用SparseBoolean数组存储reyclerview中单击项目的位置。检查此链接中的答案
https://stackoverflow.com/questions/46336645/hilighted-selected-items-colour-changes-when-not-in-view-in-recyclerview/46336844#46336844
在这里查看使用SparseBoolean数组的目的
https://stackoverflow.com/questions/18822708/what-is-the-clear-purpose-of-sparsebooleanarray-i-referred-official-android
修改强>: 使用SparseBooleanArray跟踪回收器视图适配器中的选定项目
将SparseBooleanArray初始化为私有的memeber变量
private SparseBooleanArray mClickedItems=new SparseBooleanArray();
单击textCardView时,在单击功能内部使项目位置为true。
holder.textCardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickedItems.put(position,true);
notifyDataSetChanged();
}
});
然后在onBindViewHolder中检查位置是否已被选中,如果
if(mClickedItems.get(position)==true){
//Show selected color
holder.textCardView.setBackgroundResource(ContextCompat.getColor(holder.textCardView.getContext(),R.drawable.selected));
}else {
//show unselected color
holder.textCardView.setBackgroundResource(ContextCompat.getColor(holder.textCardView.getContext(),R.drawable.unselected));
}