Kamil Kamili
Kamil Kamili

Reputation: 1927

CardView Row Highlighting In RecyclerView

I am using the BigNerdRanch Library for my recycler view. I have fixed everything except for the highlighting of the rows. On LongClick the specific card doesnt highlight. Dont know why. OnClick works but then the highlighting of the views back to original color (which is white in my case) during deselection doesnt work. Any ideas or suggestions.

This is my layout for the 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>

This is where I am implementing my clicks which is inside the 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);
        }
    }

Upvotes: 0

Views: 1826

Answers (2)

Yasin Ka&#231;maz
Yasin Ka&#231;maz

Reputation: 6663

I don't know why but background is not working inside CardView and I am changing foreground.

So my row layout is like that :

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

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

Then selecting item is like that : viewHolder.mFrameLayout.setSelected(false/true);

If you want to see how it looks like checkout my question : binary-xml-file-line-error-inflating-class-unknown

Upvotes: 2

Gurupad Mamadapur
Gurupad Mamadapur

Reputation: 989

Had a hard time to understand the code because of uneven code conventions. Nevertheless highlighting of a card to black when longPressed and back to white on deselection is fixed. I've created a pull request on your GitHub repo. You can see the changes here - https://github.com/kk1429/SampleCategoryApp/pull/1/files

Although there is a problem with deletion but it does not concern Multiselect library, check that with your delete method in your custom database class and with your custom adapter.

Upvotes: 0

Related Questions