How to select the first row of a RecyclerView by default, and then remove the selection as and when other rows are selected?

I am trying to load a list into RecyclerView and show the first line of the list as selected. I achieved this using the following code:

 @Override public void onBindViewHolder(NavigationDrawerAdapter.ViewHolder holder, final int position) { if (!mNavClassrooms.get(position).equals("")) { holder.mTextViewClassroom.setText(mNavClassrooms.get(position)); // Setting the Text with the array of our Titles holder.mRelLayClassroom.setSelected(mSelectedItems.get(position, false)); /* The following code was written to make the first item in the Classroom list as selected. It leads to the item always being selected and hence has been commented out. */ if(position == 0 && intOldSelectedItem == -1){ holder.mRelLayClassroom.setSelected(mSelectedItems.get(position, true)); intOldSelectedItem = 0; mSelectedView = holder.mRelLayClassroom.getChildAt(position); mSelectedItems.put(position, true); } else{ holder.mRelLayClassroom.setSelected(mSelectedItems.get(position, false)); } } else { holder.mTextViewClassroom.setText("No classes found"); holder.mTextViewClassroom.setPadding(40, 0, 0, 0); } holder.mRelLayClassroom.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mSharedPreferences = mContext.getSharedPreferences(Constants.AAPREFERENCES, Context.MODE_PRIVATE); String strClassroomValue = mNavClassrooms.get(position); int strClassroomName = mNavClassroomNames.get(position); SharedPreferences.Editor editor = mSharedPreferences.edit(); editor.putString(Constants.CLASSROOM_VALUE, strClassroomValue); editor.putInt(Constants.CLASSROOM_NAME, strClassroomName); editor.commit(); /* We are storing the position of the selected row in the SparseBooleanArray. We delete it in case another row has been selected. */ if (mSelectedItems.get(position, false)) { /* Do nothing */ } else { mSelectedItems.put(position, true); /* Making sure that the delete code is called only if some view is selected */ if (mSelectedView != null) { mSelectedView.setSelected(false); mSelectedItems.delete(intOldSelectedItem); view.setSelected(false); } mSelectedView = view; intOldSelectedItem = position; view.setSelected(true); } } 

However, now the first line is always selected. I can not cancel the selection. I can't seem to work.

I mentioned the following answer to achieve most of this feature.

stack overflow

Any help would be appreciated.

+3
android android-recyclerview recycler-adapter
Jul 13 '16 at 9:19
source share
3 answers

I am not answering your question by posting a fixed version of your onBindViewHolder method, as this is hard to understand, and we don’t know what the rest of your adapter looks like. So, following the RecyclerView adapter that does what you want: select the first row by default and deselect it after selecting another row.

 public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> { // ... other fields // default selection position is the first one private int selectedPosition = 0; // ... constructor etc. @Override public void onBindViewHolder(final ViewHolder holder, int position) { if(position == selectedPosition){ holder.itemView.setSelected(true); } else { holder.itemView.setSelected(false); } // Actual selection / deselection logic holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int currentPosition = holder.getLayoutPosition(); if(selectedPosition != currentPosition){ // Temporarily save the last selected position int lastSelectedPosition = 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 think there is no need to use a SparseBooleanArray , so just delete it and replace it with the int field used in the above example.

+5
Jul 13 '16 at 11:07
source share

Initialize

 int intOldSelectedItem=0 and keep one boolean 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(new View.OnClickListener() { @Override public void onClick(View v) { if (intOldSelectedItem== holder.getPosition()) { isVisible = !isVisible; } else { if (intOldSelectedItem!= 0) { isVisible = false; notifyItemChanged(intOldSelectedItem); } isVisible = true; } intOldSelectedItem= holder.getPosition(); notifyItemChanged(intOldSelectedItem); } }); 

Hope this helps you.

0
Jul 13 '16 at 9:48
source share
  • Add a background selector to the ViewHolder layout.
  • Create a 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 the 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 a listener to itemView and pass it to the handler:

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

0
Jul 13 '16 at 13:32
source share



All Articles