Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CardView selected background color in RecyclerView

Tags:

android

i am trying to write a RecyclerView with CardViews and using CAB trying to delete multiple Cards on selection .How do i give background color to the selected cards. i am trying to use statelistdrawable as the following :

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true" android:drawable="@color/primary_dark" />

    <item android:drawable="@android:color/transparent" />

</selector>

and apply it to the CardView layout as :

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_view"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
android:background="@drawable/statelist_item_background"
        card_view:cardCornerRadius="10dp"
    card_view:cardElevation="10dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"


    >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"

        >

        <ImageView
            android:id="@+id/imageView"
            android:tag="image_tag"
            android:layout_width="72dp"
            android:layout_height="100dp"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/one"/>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:layout_weight="2"
            android:orientation="vertical"
            >

            <TextView
                android:id="@+id/textViewName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="10dp"
                android:text="Large Text"
                android:textAppearance="?android:attr/textAppearanceLarge"/>

            <TextView
                android:id="@+id/textViewEmail"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="10dp"

                android:text="Medium Text"
                android:textAppearance="?android:attr/textAppearanceMedium"/>

        </LinearLayout>
    </LinearLayout>

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

below is the code for my adapter

public class modeladapter extends RecyclerView.Adapter<modeladapter.myholder> {

    ArrayList<MyModel> arraylist;
SparseBooleanArray selecteditems;
    public modeladapter(ArrayList<MyModel> ar) {
        arraylist=ar;
        selecteditems=new SparseBooleanArray();
    }

    public void removeData(int position) {
        arraylist.remove(position);
        notifyItemRemoved(position);
    }

    public MyModel getItem(int position) {
        return arraylist.get(position);
    }

    public void addData(MyModel newModelData, int position) {
        arraylist.add(position, newModelData);
        notifyItemInserted(position);
    }

    public void toggleSelection(int pos) {
        if (selecteditems.get(pos, false)) {
            selecteditems.delete(pos);
        }
        else {
            selecteditems.put(pos, true);
        }
        notifyItemChanged(pos);
    }

    public void clearSelections() {
        selecteditems.clear();
        notifyDataSetChanged();
    }

    public int getSelectedItemCount() {
        return selecteditems.size();
    }

    public List<Integer> getSelectedItems() {
        List<Integer> items = new ArrayList<Integer>(selecteditems.size());
        for (int i = 0; i < selecteditems.size(); i++) {
            items.add(selecteditems.keyAt(i));
        }
        return items;
    }





    @Override
    public modeladapter.myholder onCreateViewHolder(ViewGroup viewGroup, int i) {
        LayoutInflater lf=LayoutInflater.from(viewGroup.getContext());

            View v = lf.inflate(R.layout.card_lay, viewGroup, false);

//            v.setOnClickListener(Activity_Main.listener);
            myholder m=new myholder(v);
            return m;



    }


    @Override
    public void onBindViewHolder(modeladapter.myholder m, int i) {

                m.cimage.setImageResource(arraylist.get(i).url);
                m.email.setText(arraylist.get(i).email);
                m.name.setText(arraylist.get(i).name);
m.itemView.setActivated(selecteditems.get(i,false));

         }

    @Override
    public int getItemCount()  {return (arraylist.size());}

    public static class myholder extends RecyclerView.ViewHolder
    {
        ImageView cimage;
        TextView name,email;

        public myholder(View itemView) {
            super(itemView);
            cimage= (ImageView) itemView.findViewById(R.id.imageView);
            name= (TextView) itemView.findViewById(R.id.textViewName);
            email= (TextView) itemView.findViewById(R.id.textViewEmail);
            if(itemView.isActivated())
                itemView.setBackgroundColor(itemView.getContext().getResources().getColor(R.color.primary_dark));
            else
                itemView.setBackgroundColor(Color.parseColor("#ffffff"));
        }
    }

kindly update how i can change the background color of selected items. thanks

like image 841
user2779311 Avatar asked Jan 27 '15 18:01

user2779311


People also ask

How to use CardView in RecyclerView in Android?

Navigate to the app > java > your apps package name > Right Click on it > New > Java Class and name your Adapter Class(Here CourseAdapter). Adapter Class in RecyclerView will get the data from your Modal Class and set that data to your item of RecyclerView.

What is CardView in Android?

CardView is a new widget in Android that can be used to display any sort of data by providing a rounded corner layout along with a specific elevation. CardView is the view that can display views on top of each other. The main usage of CardView is that it helps to give a rich feel and look to the UI design.

How do you color your card on Android?

To set the content color for Card in Android Jetpack Compose, set contentColor parameter with the required Color value.


1 Answers

You do not necessarily need to have a StateListDrawable You need to have a method in your adapter that checks for selections:

sparseArray.valueAt(i).isSelected()

Then in your RecylcerView.Adapter, change:

if (itemView.isActivated())
    itemView.setBackgroundColor(itemView.getContext().getResources().getColor(R.color.primary_dark));
else
    itemView.setBackgroundColor(Color.parseColor("#ffffff"));

To(You need to change the cardView, not the itemView):

 viewHolder.cardView.setCardBackgroundColor(sparseArray.valueAt(i).isSelected() ? Color.LTGRAY : Color.WHITE);
like image 142
Jared Burrows Avatar answered Oct 03 '22 00:10

Jared Burrows