Android, Blog

How to implement a RecyclerView

Mateusz Budzar

Mateusz Budzar

All the useful knowledge about implementing a RecyclerView in one place. Learn how to set a Layout Manager, how to create an adapter, set the data on the list and much more!

In this article you will learn:

  • how to create the RecyclerView
  • how to set a LayoutManager
  • how to create an adapter
  • how to set the data on the list
  • why we need the ViewHolder pattern

RecyclerView – what is this?

RecyclerView is a UI component which allows us to create a scrolling list. It was introduced with Android Lollipop and it’s a kind of ListView2. If we are able to, we should use this one instead of a ListView because it forces us to use a more efficient way of implementing a list and separates responsibilities to other classes.

If you aren’t familiar with the ListView, check out my article about it.

To implement a RecyclerView, we have to create the following:

  • a RecyclerView which we should add to our screen layout,
  • a layout for each row in the list,
  • an adapter which holds the data and binds them to the list.

How to create a RecyclerView

Before we do that, we have to add a dependency to the build.gradle.

Remember to update the library version to the most recent one. You can check it here.

Now we are able to add a RecyclerView to the layout.

How to implement a RecyclerView - Adding a RecyclerView to the layout

Figure 1. Adding a RecyclerView to the activity_main.xlm layout

How to implement a RecyclerView - Creating the RecyclerView in the Activity

Figure 2. Creating the RecyclerView in the Activity

On the created RecyclerView instance, we have to set a Layout Manager. Following this documentation:

A LayoutManager is responsible for measuring and positioning item views within a RecyclerView, as well as determining the policy for when to recycle item views that are no longer visible to the user.

So, basically, it means that the LayoutManager is layouting the list in the chosen way. In this example, we’ve used LinearLayoutManager which shows the data in a simple list — vertically or horizontally (by default vertically). But it can be changed in very simply, just by calling a different one, like GridLayoutManager, StaggeredGridLayoutManager or event WearableLinearLayoutManager. Great, now we’ll create a layout for each list row.

How to create a list row layout

In the same way as any other layout.

How to implement a RecyclerView - Creating a list row layout

Figure 3. Creating a list row layout

The list row layout is pretty simple – it just needs some image and text next to it. To make this happen, we used LinearLayout with a horizontal orientation. Note the warning on the LinearLayout. It’s telling us that we should design our layout in a more efficient way.

How to implement a RecyclerView - Android Studio warning message

Figure 4. Android Studio warning message

In this case, we could use the android:drawableStart attribute in TextView but then the image should also have the proper size. ImageView, on the other hand, gives me more possibilities and I was able to change the image size easily – I wanted to keep it as simple as I can.

An android:padding attribute is used in the LinearLayout. If you aren’t familiar with this attribute, you should take a look at my short article about it.

Now, we should create an adapter.

How to create an adapter

How to implement a RecyclerView - An example of RecyclerView’s adapter

Figure 5. An example of RecyclerView’s adapter

We have to create a class which extends RecyclerView.Adapter, which as a parameter takes a class which extends RecyclerView.ViewHolder. Another thing that we need to do is override some needed methods.

What are these methods doing?

  • getItemCount() returns the total number of the list size. The list values are passed by the constructor.
  • onCreateViewHolder() creates a new ViewHolder object whenever the RecyclerView needs a new one. This is the moment when the row layout is inflated, passed to the ViewHolder object and each child view can be found and stored.
  • onBindViewHolder() takes the ViewHolder object and sets the proper list data for the particular row on the views inside.

The whole code in one piece looks like this:

How to implement a RecyclerView - An example of RecyclerView implementation

Figure 6. An example of RecyclerView implementation

We can build the project and see the results.

How to implement a RecyclerView - Example of a scrolling list with the use of RecyclerView

Figure 7. Example of scrolling list with the use of RecyclerView

Why we need the ViewHolder pattern

Long story short, the ViewHolder prevents unnecessary findViewById() calls on each bind. If you aren’t familiar with this pattern, I encourage you to look at my example of list implementation using ListView. I believe that this is the best way to know what is going on with this pattern and what the potential problems can occur from not using it.

If the list row layout isn’t inflated for each row, how many times is it inflated? How many times are the onCreateViewHolder() and the onBindViewHolder() method called?

How RecyclerView reuses views

To check this, we’ll put some logs in our code.

How to implement a RecyclerView - Using Log class to see reusing list elements

Figure 8. Using Log class to see reusing list elements

Ok, so let’s see what is happening.

Figure 9. An example of calling onCreateViewHolder() and onBindViewHolder() methods

As you can see, the onCreateViewHolder() method is called and the ViewHolder objects are created for a couple of first views and then the created ones are being reused, while the adapter is just binding the data with the onBindViewHolder()method. Thanks to this, the list is very efficient and a user can scroll the list smoothly because the most costly calls (like inflating and finding views) are happening inside the onCreateViewHolder() method.

That’s it!


Other helpful resources:

1. Implementation of the RecyclerView in the documentation

2. A more advanced example of using the RecyclerView


Wrap up

A RecyclerView is a bit more complicated type of View but it’s very common to use on our daily basis, so we should know how to handle it. We’ve learned how to create the RecyclerView and set a LayoutManager, how to create an adapter, set the data on the list and why we need the ViewHolder pattern. I hope you liked it. All the best!


The post was written by Mateusz Budzar, Droids On Roids Android Developer. You can also find his articles on Medium

Newsletter

The post is created by Droids On Roids Team Member.
We would love to take care of your business.

Leave comment