Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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(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 row stays selected always. I am unable to deselect it. I cannot seem to get this working.

I referred to the following answer to achieve most of this functionlaity.

https://stackoverflow.com/a/29984220/2186220

Any help will be appreciated.

like image 469
Bot Avatar asked Mar 11 '23 17:03

Bot


1 Answers

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.

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 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.

like image 137
reVerse Avatar answered Apr 06 '23 02:04

reVerse