如何在默认情况下突出显示RecyclerView的第一行,然后在选择其他行时删除突出显示?

Bot*_*Bot 4 android recycler-adapter android-recyclerview

我正在尝试加载列表RecyclerView并将列表的第一行显示为已选中.我使用以下代码实现了它:

@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);
                }

}
Run Code Online (Sandbox Code Playgroud)

但是,现在第一行始终保持选中状态.我无法取消选择它.我似乎无法让这个工作.

我提到了以下答案来实现这个功能的大部分.

/sf/answers/2098895431/

任何帮助将不胜感激.

reV*_*rse 6

我没有通过发布您的onBindViewHolder方法的固定版本来回答您的问题,因为它有点难以理解,我们不知道您的适配器的其余部分是什么样的.因此,遵循您所需的RecyclerView适配器:默认情况下选择第一行,选择另一行后取消选择.

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.
}
Run Code Online (Sandbox Code Playgroud)

注意:我想没有必要使用SparseBooleanArray它,只需删除它并将其替换为上面示例中使用的int字段.