Card View was announced by Google in I/O ‘14 conference. Although it started a bit slow, but now we can see most of the apps like Snapchat, Google, Facebook, etc. using this widget. So, this blog is solely contributed on how to implement Card View in your own app by taking example of PSLab application.
What is Card View ?
CardView is a view container or ViewGroup that inherits its nature from FrameLayout which further inherits from ViewGroup itself. The only thing that separates a CardView from any other ViewGroups is its nature to behave like a card, more specifically the shadow and rounded corners. The basic customization that a CardView provides includes CornerRadius, Elevation, MaxElevation, ContentPadding, CompatPadding, PreventCornerOverlap, and a dedicated CardBackgroundColor or say Card Background which is the most necessary feature for a card to look cool.
Step by Step description how CardView was implemented in PSLab
- First step is to add dependencies in your project as widgets like Card View, Recyclerview, etc. are not included in a common repository of widgets provided by Google.
App level dependency :
compile 'com.android.support:cardview-v7:26.0.0'
compile 'com.android.support:recyclerview-v7:+'
If you are using Android Studio 3.0+ than add the following dependency instead of above :
implementation 'com.android.support:cardview-v7:26.0.0'
implementation 'com.android.support:recyclerview-v7:27.1.1'
- Now we can use Card View widget in our app. So, first make add card view in layout section like this :
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="@dimen/total_height_card"
android:layout_gravity="center"
android:layout_margin="@dimen/card_margin"
card_view:cardCornerRadius="@dimen/card_radius">
</android.support.v7.widget.CardView>
These are the basic attributes that are used while declaring a card view. Other possible attributes can be :
- Elevation – Used to elevate card to give a depth effect
- MaxElevation – Used to give constraint to the depth effect
- ContentPadding – Used to provide padding between content and the card
- PreventCornerOverlap – To prevent different corners to overlap as shown in figure 1.
Figure 1. Image showing corner overlapping in CardView
- Now to set the objects inside the Card View, mostly RelativeLayout is preferred as it gives the freedom to place objects in reference of others whereas LinearLayout provides freedom to place them in only one direction. Other layouts such as FrameLayout, Tables, etc. can be used as per the need of the app.
- Now we will create a layout that will hold all the cards using RecyclerView.
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
- Now after setting the layouts, it’s time to make adapter which inflates the information in the cards which is then represented using RecyclerView.
public class ApplicationAdapter extends RecyclerView.Adapter<ApplicationAdapter.Holder> {
private List<ApplicationItem> applicationList;
private final OnItemClickListener listener;
/**
* View holder for application list item
*/
public class Holder extends RecyclerView.ViewHolder {
TextView header, description;
ImageView applicationIcon; //Background Image
public Holder(View itemView) {
super(itemView);
this.header = itemView.findViewById(R.id.heading_card);
this.description = itemView.findViewById(R.id.description_card);
this.applicationIcon = itemView.findViewById(R.id.application_icon);
}
public void setup(final ApplicationItem applicationItem, final OnItemClickListener listener) {
header.setText(applicationItem.getApplicationName());
description.setText(applicationItem.getApplicationDescription());
applicationIcon.setImageResource(applicationItem.getApplicationIcon());
}
}
public ApplicationAdapter(Context mContext, List<ApplicationItem> applicationList, OnItemClickListener listener) {
this.mContext = mContext;
this.applicationList = applicationList;
this.listener = listener;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.application_list_item, parent, false);
return new Holder(itemView);
}
Following is the detailed explanation of each and every method :
- Holder(View ) – As name suggests, it holds all the items that are included in a single card together
- setup() – This method can contain any number of parameters as per requirement. It basically sets the data in the views in the card
- ApplicationAdapter() – Constructor
- onCreateViewHolder() – It inflates the layout containing CardView as soon as the data gets ready to be fed in it
- Now as adapter is ready, we can declare RecyclerView in Java code to implement CardView. The main reason to use RecyclerView is that it provides the feature of scrollability so that a number of cards can be adjusted on the screen. ScrollView can also be used but it slows down the app as it tries to load all the card at once rather than loading cards as per use like RecyclerView.
RecyclerView listView = view.findViewById(R.id.applications_recycler_view);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(context, rows);
listView.setLayoutManager(mLayoutManager);
listView.setItemAnimator(new DefaultItemAnimator());
listView.setAdapter(applicationAdapter);
Here, we have used GridLayoutManager to use grids along with RecyclerView. It is optional and can be used as per requirement. Also, before setting adapter, fill the adapter with relevant data or else no card will be seen in actual app.
- Now the app is ready to be built and tested on mobile device. This is how it looks in the PSLab application after implementing the above guide :
Figure 2. Screenshot of CardView implemented in PSLab app
So, in this way great user experience can be given by using this very basic widget. But great attention should be given while designing the objects inside the card as the selection and position of the objects is what makes the card look good. Objects used in making cards for PSLab very well suited the app and so are designed like that. Practice should be done by taking reference of some very good apps like Snapchat, Google, etc. and from Material Designs provided by Google before implementing them in actual project.
Resources
- https://www.androidhive.info/2016/05/android-working-with-card-view-and-recycler-view/ – This article gives a better practice by implementing a real world example
- https://developer.android.com/reference/android/support/v7/widget/CardView – Official documentation by Google on CardView
- https://developer.android.com/guide/topics/ui/layout/recyclerview – Official documentation by Google on RecyclerView