1

I have a RecyclerView with a large list of items. This RecyclerView has OnScrollListener for endless scrolling.

  • When an item is selected I highlight it with a specific colour and
  • when unselected the colour changes to normal/white.

The issue that I am facing is after selecting a few visible items in my view when I scroll up or down to select a few more items the colour of already selected items changes to white.

I tried adding a boolean variable (isSelected) in the model class and highlight the selected item but still I am facing the same issue as earlier. Currently the recyclerView allows to select just one item from the view and after some research I figured some of the concepts were taken from this article to implement single item selection. I wonder how do I modify/tweak this code to be able to select multiple items.

I am not presenting the code as it is quite huge and is confidential but if there is any general fix for this scenario then what would it be?

Background: the application is a chat app and I am showing the sent and received texts. The user should be able to select a few specific texts and should be able to share it with someone else.

Edit: I am putting the code in my 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); */
                }
            });
}

The code which I have commented in onCLick and onLongClick were used when the requirement was to select a single item.

these are the methods which were called in onClick and 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 {

        }

    }

The variable selectedPosition in onClick and clearLongSelection is initialised in the class as instance variable- selectedPosition = -1.

localhost
  • 107
  • 1
  • 11

1 Answers1

0

Use SparseBooleanArray to keep track of selected items in recycler view adapter

Initialize the SparseBooleanArray as private memeber variable

private SparseBooleanArray mClickedItems=new SparseBooleanArray();

Then inside your click function while clicking any item,store the clicked item position as true.

mClickedItems.put(getAdapterPosition(),true);
notifyDataSetChanged();

Then in the onBindViewHolder check if the position is already selected or not like this

if(mClickedItems.get(position)==true){
   //Show selected color
}else {
  //show unselected color
}
Sharath kumar
  • 4,064
  • 1
  • 14
  • 20