How To Highlight The First Row Of Recyclerview By Default And Then Remove Highlight As And When Other Rows Are Selected?
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:
- Add background selector to your ViewHolder layout.
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; } } }
Set default selection when you need it:
@Override public void onBindViewHolder(SimpleViewHolder holder, int position) { if (position == 0) { singleSelector.setSelection(holder.itemView); } }
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?"