CardView 行在 RecyclerView 中突出显示

CardView Row Highlighting In RecyclerView

我正在使用 BigNerdRanch 库作为我的回收站视图。除了突出显示行之外,我已经修复了所有内容。长按 具体的卡片没有突出显示。不知道为什么。 OnClick 有效,但随后在取消选择期间将视图突出显示回原始颜色(在我的情况下为白色)不起作用。任何想法或建议。

这是我的 RecyclerView 布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/frame_layout_holder">

    <android.support.v7.widget.CardView
        android:id="@+id/card_holder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardCornerRadius="0dp">

        <RelativeLayout
            android:id="@+id/card_linear_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/avatar_holder"
                android:layout_width="@dimen/profile_pic_size"
                android:layout_height="@dimen/profile_pic_size"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="@dimen/activity_horizontal_margin"
                android:layout_marginRight="@dimen/activity_horizontal_margin"
                android:contentDescription="Olla Image" />

            <LinearLayout
                android:id="@+id/text_holder_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@+id/avatar_holder"
                android:layout_toLeftOf="@+id/checkbox_holder"
                android:layout_toRightOf="@+id/avatar_holder"
                android:layout_toStartOf="@+id/checkbox_holder"
                android:orientation="vertical"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingEnd="@dimen/activity_horizontal_margin"
                android:paddingLeft="0dp"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingStart="0dp"
                android:paddingTop="@dimen/activity_vertical_margin">

                <TextView
                    android:id="@+id/text_view1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#ff00ff"
                    android:textSize="@dimen/list_item_1" />

                <TextView
                    android:id="@+id/text_view2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#ff00ff"
                    android:textSize="@dimen/list_item_2" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/checkbox_holder"
                android:layout_width="@dimen/check_box_holder_width"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:gravity="center"
                android:orientation="vertical"
                android:visibility="gone">

                <CheckBox
                    android:id="@+id/checkbox"
                    android:layout_width="@dimen/check_box_width"
                    android:layout_height="@dimen/check_box_width" />

                <ImageView
                    android:id="@+id/delete_row"
                    android:layout_width="@dimen/check_box_width"
                    android:layout_height="@dimen/check_box_width"
                    android:contentDescription="Delete Image"
                    android:src="@android:drawable/ic_menu_close_clear_cancel"
                    android:visibility="invisible" />
            </LinearLayout>

        </RelativeLayout>

    </android.support.v7.widget.CardView>
</FrameLayout>

这是我在 Holder 中实现点击的地方:

 public class CustomRecyclerViewHolder extends SwappingHolder implements View.OnClickListener, View.OnLongClickListener {

        private TextView mMsg1, mMsg2;
        //private ImageView mAvatarView;
        private CheckBox mCheckBox;
        private LinearLayout checkboxHolder;
        private ImageView mDeleteRow;
        private CardView cardView;
        private Category category;
        private CustomRecyclerViewHolder customRecyclerViewHolder;
        private int i = 0;
        private RelativeLayout relativeLayoutInCardView;
        /**
         * Initializes all the views of a ViewHolder
         *
         * @param itemView parent view in which all the List Item views are present
         */
        public CustomRecyclerViewHolder(View itemView) {
            super(itemView, mycategoryFragment.mMultiSelector);
            mMsg1 = (TextView) itemView.findViewById(R.id.text_view1);
            mMsg2 = (TextView) itemView.findViewById(R.id.text_view2);
            //mAvatarView = (ImageView)itemView.findViewById(R.id.avatar_holder);
            mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);
            checkboxHolder = (LinearLayout) itemView.findViewById(R.id.checkbox_holder);
            mDeleteRow = (ImageView) itemView.findViewById(R.id.delete_row);
            cardView = (CardView) itemView.findViewById(R.id.card_holder);
            relativeLayoutInCardView = (RelativeLayout) itemView.findViewById(R.id.card_linear_holder);
            itemView.setOnClickListener(this);
            itemView.setLongClickable(true);
            itemView.setOnLongClickListener(this);
        }

        public void bindcategory(Category category) {
            this.category = category;
            mMsg1.setText(category.getMedicineName());
            mMsg2.setText(category.getDescriptionName());
            System.out.println("86969696978");
            if (mycategoryFragment.mMultiSelector.getSelectedPositions().size()==0) {
                relativeLayoutInCardView.setBackgroundColor(Color.BLACK);
            }
        }

        @Override
        public void onClick(View v) {

            if (category == null) {
                return;
            }
            if (mycategoryFragment.mMultiSelector.tapSelection(this)) {
                for (int i = categoryArrayList.size(); i >= 0; i--) {
                    if (mycategoryFragment.mMultiSelector.isSelected(i, 0)) {
                        System.out.println("I am at position in OnClick at " + i);
                        relativeLayoutInCardView.setBackgroundColor(Color.BLACK);
                    }
                    if (!mycategoryFragment.mMultiSelector.isSelected(i, 0)) {
                        System.out.println("I am at position in OnClick at " + i);
                        relativeLayoutInCardView.setBackgroundColor(Color.WHITE);
                    }
                }
                if (mycategoryFragment.mMultiSelector.getSelectedPositions().size()==0) {
                        isOnLongPressReceived = false;
                        System.out.println("I am at end");
                }
            }
        }


        @Override
        public boolean onLongClick(View v) {

            if(!isOnLongPressReceived) {
                ((AppCompatActivity) mContext).startSupportActionMode(mycategoryFragment.mDeleteMode);
                mycategoryFragment.mMultiSelector.setSelected(this, true);
                for (int i = categoryArrayList.size(); i >= 0; i--) {
                    if (mycategoryFragment.mMultiSelector.isSelected(i, 0)) {
                        System.out.println("I am at position in OnLong at " + i);
                        cardView.setBackgroundColor(Color.BLACK);
                    }
                }
                isOnLongPressReceived = true;
            }
            return true;
        }

        @Override
        public void setSelectable(boolean isSelectable) {
            super.setSelectable(isSelectable);
            //relativeLayoutInCardView.setBackgroundColor(Color.BLACK);
        }

        @Override
        public void setActivated(boolean isActivated) {
            super.setActivated(isActivated);
            relativeLayoutInCardView.setBackgroundColor(Color.WHITE);
        }
    }

由于代码约定不统一,很难理解代码。然而,当长按时将卡片突出显示为黑色并在取消选择时突出显示为白色是固定的。我已经在您的 GitHub 存储库上创建了一个拉取请求。您可以在此处查看更改 - https://github.com/kk1429/SampleCategoryApp/pull/1/files

尽管删除存在问题,但它与多选库无关,请使用自定义数据库中的删除方法 class 和自定义适配器进行检查。

我不知道为什么,背景在 CardView 中不起作用,我正在更改前景。

所以我的行布局是这样的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:cardUseCompatPadding="true"
    android:clickable="true"
    android:id="@+id/row_note_cardview"
    card_view:cardCornerRadius="4dp"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    card_view:cardElevation="4dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/row_note_frame"
    android:foreground="@drawable/state">
</FrameLayout>

  --- other layouts ---
</android.support.v7.widget.CardView>

我的state.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_selected="true" android:drawable="@null">
    <shape android:shape="rectangle"  >
        <solid android:color="@color/colorSelected"   />
        <stroke  android:width="2dp" android:color="@color/colorSelectedDark"  />
    </shape>
</item>

<item android:state_selected="false"  >
    <shape >
        <solid android:color="@android:color/transparent" />
    </shape>
</item>

</selector>

然后选择项目就是这样:viewHolder.mFrameLayout.setSelected(false/true);

如果您想查看它的外观,请查看我的问题:binary-xml-file-line-error-inflating-class-unknown