Skip to content Skip to sidebar Skip to footer

How To Highlight The First Row Of Recyclerview By Default And Then Remove Highlight As And When Other Rows Are Selected?

I am trying to load a list in RecyclerView and show the first row of the list as selected. I have achieved it using the following code: @Override public void onBindViewHolder(Navig

Solution 1:

I'm not answering your question by posting a fixed version of your onBindViewHolder method since it's kinda hard to understand and we don't know how the rest of your adapter looks like. So following a RecyclerView Adapter which does what you want: Selecting the first row by default and deselecting it once a other row is selected.

publicclassAdapterextendsRecyclerView.Adapter<Adapter.ViewHolder> {

    // ... other fields// default selection position is the first oneprivateintselectedPosition=0;

    // ... constructor etc.@OverridepublicvoidonBindViewHolder(final ViewHolder holder, int position) {
        if(position == selectedPosition){
            holder.itemView.setSelected(true);
        } else {
            holder.itemView.setSelected(false);
        }

        // Actual selection / deselection logic
        holder.itemView.setOnClickListener(newView.OnClickListener() {
            @OverridepublicvoidonClick(View view) {
                intcurrentPosition= holder.getLayoutPosition();
                if(selectedPosition != currentPosition){
                    // Temporarily save the last selected positionintlastSelectedPosition= selectedPosition;
                    // Save the new selected position
                    selectedPosition = currentPosition;
                    // update the previous selected row
                    notifyItemChanged(lastSelectedPosition);
                    // select the clicked row
                    holder.itemView.setSelected(true);
                }
            }
        });
        // other adapter code
    }

    // other adapter stuff like onCreateViewHolder, getItemCount, ViewHolder etc.
}

Note: I guess there's no need to use a SparseBooleanArray so simply remove it and replace it with the int field used in the example above.

Solution 2:

Initialize your

int intOldSelectedItem=0and keep oneboolean isVisible=false;

And do it as below:

if (holder.getPosition() == intOldSelectedItem) {
        if (isVisible) {
            //background for selected item
        } else {
        //background for unselected item
        }
} else {
        //background for unselected item
}

holder.mRelLayClassroom.setOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View v) {
            if (intOldSelectedItem== holder.getPosition()) {
                isVisible = !isVisible;
            } else {
                if (intOldSelectedItem!= 0) {
                    isVisible = false;
                    notifyItemChanged(intOldSelectedItem);
                }
                isVisible = true;
            }
            intOldSelectedItem= holder.getPosition();
            notifyItemChanged(intOldSelectedItem);
        }
    });

I hope it might help you.

Solution 3:

  1. Add background selector to your ViewHolder layout.
  2. Create your selector handler something like this:

    public class SingleSelector { private View oldVIew; public void setSelection(View newView) { if (oldVIew == null) { newView.setSelected(true); oldVIew = newView; } else { oldVIew.setSelected(false); newView.setSelected(true); oldVIew = newView; } } }

  3. Set default selection when you need it:

    @Override public void onBindViewHolder(SimpleViewHolder holder, int position) { if (position == 0) { singleSelector.setSelection(holder.itemView); } }

  4. In your ViewHolder add listener to itemView and pass it to the handler:

    itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { singleSelector.setSelection(itemView); } });

Post a Comment for "How To Highlight The First Row Of Recyclerview By Default And Then Remove Highlight As And When Other Rows Are Selected?"