将RecyclerView中的选定位置添加到集合中并突出显示这些位置

时间:2017-09-21 12:23:01

标签: android android-recyclerview

我有一个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()中完成。

1 个答案:

答案 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));
    }