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!
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).
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With