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

时间:2016-07-13 09:19:55

标签: android android-recyclerview recycler-adapter

我正在尝试在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);
                }

}

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

我提到了以下答案来实现大部分功能。

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

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

我没有通过发布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. } 方法的固定版本来回答您的问题,因为它有点难以理解,我们也不知道您的适配器的其余部分是什么样的喜欢。因此,遵循您所需的RecyclerView适配器:默认选择第一行,并在选择另一行后取消选择。

SparseBooleanArray

注意:我想没有必要使用{{1}}所以只需删除它并将其替换为上例中使用的int字段。

答案 1 :(得分:0)

初始化

int intOldSelectedItem=0 and keep one boolean isVisible= false;

按以下步骤操作:

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

我希望它对你有所帮助。

答案 2 :(得分:0)

  1. 将背景选择器添加到ViewHolder布局。
  2. 创建这样的选择器处理程序:

    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. 在您需要时设置默认选择:

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

  4. 在ViewHolder中将监听器添加到itemView并将其传递给处理程序:

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