5

I have no idea why my cards appear grey on my API 21 and 19 emulator. I have built RecyclerViews with CardViews before and they were white. I don't change the background color anywhere. It appears normal on my API 26 emulator.

enter image description here

This my layout for the cards:

<android.support.v7.widget.CardView 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:layout_margin="8dp">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:text="Name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />


    <ImageView
        android:id="@+id/image_view_upload"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_below="@+id/text_view_name" />

</RelativeLayout>

This is my adapter class:

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {

private Context mContext;
private List<Upload> mUploads;


public ImageAdapter(Context context, List<Upload> uploads) {
    mContext = context;
    mUploads = uploads;
}

@Override
public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.image_item, parent, false);
    return new ImageViewHolder(v);
}

@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
    Upload upload = mUploads.get(position);
    holder.textViewName.setText(upload.getName());
    Picasso.with(mContext)
            .load(upload.getImageUrl())
            .fit()
            .centerCrop()
            .into(holder.imageView);

}

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

class ImageViewHolder extends RecyclerView.ViewHolder {
    TextView textViewName;
    ImageView imageView;

    ImageViewHolder(View itemView) {
        super(itemView);

        textViewName = itemView.findViewById(R.id.text_view_name);
        imageView = itemView.findViewById(R.id.image_view_upload);
    }
}

}

I load these images from the Firebase storage. As you can see, I didn't change the background color anywhere.

Any idea?

Florian Walther
  • 6,237
  • 5
  • 46
  • 104
  • have you checked it on real device too ? sometimes emulator doesn't show the correct results. – Umair Jan 01 '18 at 13:02
  • take a look at this link : https://stackoverflow.com/questions/43781009/android-cardview-background-always-grey – Umair Jan 01 '18 at 13:06
  • I did take a look at this, but he changes the background color - I don't – Florian Walther Jan 01 '18 at 13:06
  • if you are talking about the background of textview which is in cardview then I believe you have to take a look at your styles.xml file. – Umair Jan 01 '18 at 13:10
  • No, I mean the cards themselves. They are white on API level 26, but not lower – Florian Walther Jan 01 '18 at 13:11
  • if this issue is below lollipop version then this is due to the fact that carview was announced in lollipop and certain features are not supported at less levels you have to give background to support pre-lollipop devices. – Umair Jan 01 '18 at 13:15
  • It works for my other projects so that can't be it – Florian Walther Jan 01 '18 at 13:15
  • are you testing your application on samsung emulators ? – Umair Jan 01 '18 at 13:27
  • No, on Nexus 5. The same emulators on which it works for other projects.. very weird – Florian Walther Jan 01 '18 at 13:27
  • I think you are passing the wrong type of context here. Is this the application context or of activity or fragments? try changing that and if it still doesn't work then it is wired but I believe this is due to difference API levels. – Umair Jan 01 '18 at 13:32
  • Hey, you were right. It was because I passed getApplicationContext to the adapter. I found it like this in a tutorial. If i pass the Activity context, it's white. Now I only have to figure out if I should change the context or the cards background. – Florian Walther Jan 01 '18 at 13:35
  • Great now I should add that as an answer. – Umair Jan 01 '18 at 13:36
  • Understandable. Go ahead, I will accept it – Florian Walther Jan 01 '18 at 13:37

3 Answers3

8

I believe you are passing the wrong context to your adapter to inflate your layout. Try passing activity or fragment context instead of passing applicationConetxt. ApplicationContext does not apply the theme you defined.

OR

if you don't wanna do that. you need to change background color of your carview like this:

<android.support.v7.widget.CardView 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 xmlns:card="http://schemas.android.com/apk/res-auto"
 card:cardBackgroundColor="@color/colorPrimary"
 android:layout_margin="8dp">
</android.support.v7.widget.CardView>
Umair
  • 6,366
  • 15
  • 42
  • 50
1

I am not sure why it is showing grey on api 21.

But if you want white background then you can set the background color like this.

<android.support.v7.widget.CardView 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:layout_margin="8dp"
android:background="#FFFFFF">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:background="#FFFFFF">

    <TextView
        android:id="@+id/text_view_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:text="Name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />


    <ImageView
        android:id="@+id/image_view_upload"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_below="@+id/text_view_name" />

</RelativeLayout>

Also please note that cardview is supported from api 21 only.

Rajesh K
  • 683
  • 2
  • 9
  • 35
0

As You can See in This Link

android support(cardView, RecyclerView)library in older versions with target kitkat

Your CardView is Only compatible till API level 26,which is why i asked you to post your Gradle dependencies

You can Try changing the minimum API level and see for any changes

theboringdeveloper
  • 1,429
  • 13
  • 17