Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting the background image of a CardView inside RecyclerView causes the program to crash when scrolling

I have a RecyclerView containing a list of CardViews with information that is pulled from a server, some cards have only a background color but some contains a background image. If the cards all have just background colors, the RecyclerView behaves accordingly (I am able to set the margins and corner radius as well). However, if any one card contains a background image, a crash will happen when I try to scroll up/down the list (although the background image will load without the previously set corner radius).

Here is the crash log:

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable cannot be cast to android.support.v7.widget.RoundRectDrawable
        at android.support.v7.widget.CardViewApi21.setBackgroundColor(CardViewApi21.java:107)
        at android.support.v7.widget.CardView.setCardBackgroundColor(CardView.java:234)
        at co.roverlabs.sdk.ui.CardListAdapter.onBindViewHolder(CardListAdapter.java:88)
        at co.roverlabs.sdk.ui.CardListAdapter.onBindViewHolder(CardListAdapter.java:28)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:4402)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3717)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3609)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1859)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1311)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1274)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1102)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:959)
        at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:3062)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:549)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Here is my onBindViewHolder() method (simplified with hard coded values for easier reading):

public void onBindViewHolder(final CardViewHolder holder, int position) {

    //Set margins
    CardView.LayoutParams cardLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2000);
    cardLayoutParams.setMargins(20, 20, 20, 20);
    holder.cardView.setLayoutParams(cardLayoutParams);

    //Set background color or image
    if(view.hasBackgroundImage()) {
        holder.cardView.setBackground(R.drawable.background);
    }
    else {
        holder.cardView.setCardBackgroundColor(Color.CYAN);
    }

    //Set border radius
    holder.cardView.setRadius(20);

    //Set elevation
    holder.cardView.setCardElevation(0);

Here is my onCreateViewHolder() method and custom Recycler.ViewHolder method:

public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view, parent, false);
    return new CardViewHolder(itemView);
}

public class CardViewHolder extends RecyclerView.ViewHolder {

    protected CardView cardView;

    public CardViewHolder(View view) {

        super(view);
        cardView = (CardView)view.findViewById(R.id.single_card_view);
    }
}

And finally, here is my XML file for the CardView:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/single_card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

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

    </RelativeLayout>

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

I just wish to know how to set the background of a CardView to a custom image instead of just a color, and if there are any workarounds. It is important for me to be able to set the corner radius of the cards. Thank you!

like image 281
ooxxoo Avatar asked Apr 28 '15 16:04

ooxxoo


People also ask

How to use CardView in RecyclerView in Android?

Card Layout: A card Layout is used to display a list of data. It is the design of a single item of our RecyclerView. For creating a Card Layout navigate to the app > res > layout > Right-Click on it > New > Layout Resource File > Give a name to it(here card_layout).

How do I customize my CardView?

Customized CardView First, add a CardView dependency to the application-level build. gradle file. Then create a drawable background for the cards. For that, create a new drawable resource file inside the drawable folder.

What is the use of 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.


1 Answers

Assuming you are using CardView, you cannot change background drawable because CardView uses background drawable to draw the card. You can change card background color via setCardBackgroundColor.

like image 195
yigit Avatar answered Nov 15 '22 06:11

yigit