What is the Difference Between ListView and RecyclerView?
As Android Developers, we can implement a Scrolling List using a ListView or a RecyclerView. Let’s compare these two ways and discover 5 key differences between ListView and RecyclerView which every Android developer should know.
ListView and RecyclerView – a short history
ListView is a good old widget that has been included in the Android SDK since API 1. Until Android Lollipop’s release, we mostly used this one and it wasn’t that bad – the API is mostly intuitive. Unfortunately, it allows us to create just the vertical-scrolling list of elements and, to make that list scrolling go smoothly, we have to remember to do it properly.
Moreover, the ListView class is a bit too heavy – it has a lot of responsibilities. Whenever we have to handle the list, such as to configure it in some way, the only way to do this is through the ListView object or inside the adapter.
Nowadays we use the RecyclerView. As I’ve mentioned, it was introduced with the Android Lollipop and it proved to be a game-changer. A lot of things that we hate in the ListView were fixed or changed in the RecyclerView. It’s more efficient by default, the layout is separated and we have more possibilities over the data set inside the adapter.
If you want to know more about ListView and RecyclerView, you can take a look at my articles which show how to implement a ListView and how to implement a RecyclerView. They both are helpful if you are a beginner and aim to provide Android app development services at the highest level.
At Droids On Roids we use RecyclerView in many projects in all areas, e.g. in IoT app development, finance app development, or mobile commerce app development. We used it, for example, in our of our biggest projects – development of CCC – the mobile commerce app for the largest footwear retail company in Central Europe.
Now, let’s go deeper into the differences between ListView and RecyclerView.
ListView vs RecyclerView – crucial differences
The ViewHolder pattern allows us to make our list scrolling act smoothly. It stores list row views references and, thanks to this, calling the
findViewById() method only occurs a couple of times, rather than for the entire dataset and on each bind view.
The RecyclerView’s adapter forces us to use the ViewHolder pattern. The creating part (inflating the layout and finding views) and updating the views are split into two methods —
The ListView, on the other hand, doesn’t give us that kind of protection by default, so without implementing the ViewHolder pattern inside the
getView() method, we’ll end with inefficient scrolling in our list.
The LayoutManager takes responsibility for layouting row views. Thanks to this, RecyclerView doesn’t have to think about how to position the row view. This class allows us to choose the way that we want to show the row views and how to scroll the list. For example, if we want to scroll our list vertically or horizontally, we can choose LinearLayoutManager. For grids, it is more suitable to choose GridLayoutManager.
Previously, with the use of the ListView, we were only able to create a vertical-scrolling list, so it wasn’t that flexible. If we wanted grids on our list, we had to choose the other widget for that — GridView.
Duty of the ItemDecoration is simple in theory – add some decorations for the list row views – but in practice, it’s that simple to implement if we want to create a custom one. In this case, we should extend the ItemDecoration class and implement our solution. For example, the RecyclerView list has no dividers between rows by default and it’s consistent with the Material Design guidelines. However, if we want to add a divider for some reason, we can use DividerItemDecoration and add it to the RecyclerView.
In case we use the ListView, we have to figure out rows decorations by ourselves. There is no helper class like ItemDecoration for this widget.
The last but not least component of RecyclerView that I want to mention is ItemAnimator. As we can expect, it’s handling row views animations like list appearance and disappearance, adding or removing particular views and so on.
By default, RecyclerView’s list animations are nice and smooth. Of course, we can change that by creating our own ItemAnimator, which is also not that easy. To make it easier, we should extend the SimpleItemAnimator class and implement the methods that we need (just add animations to a ViewHolder’s views).
To be honest, implementing animations on the ListView was a pain in the ass. Again, we had to figure out how we want to handle them. Nothing nice. I’m glad it’s gone.
5. Notifying adapter
We have a couple of cool notifiers on the RecyclerView’s adapter. We are still able to use
notifyDataSetChanged() but there are also ones for particular list elements, like
notifyItemRemoved() or even
notifyItemChanged() and more. We should use the most appropriate ones for what is happening, so the proper animations will fire correctly.
Using ListView, we were able to use just
notifyDataSetChanged() on the adapter and then had to handle the rest ourselves, again.
Two useful tips about RecyclerView
Since we already use the RecyclerView, it would be good to make our working with this tool more easy and enjoyable. Here is a couple of helpful features.
The callback helps us to skip manual handling of notifying an adapter. Instead of using different methods for each type of notifications as
notifyItemChanged() we just can use this simple method:
But even this approach is not the end. 🙂
ListAdapter is a casing on a RecyclerView. Adapter with the full power of
DiffUtil. Thanks to
ListAdapter we don’t need:
- keeping field with the list of items
- handling items animations
- writing methods for rendering new items
- caring for the size of items list
How does it look like? We need to define three things: two methods
DiffUtil.ItemCallback (the simplest version of
For a rendering of new items, it’s enough to use
adapter.submitList(newItems) method of
Working with RecyclerView has never been so simple and enjoyable.
ListView vs RecyclerView – wrap up
The ListView served us for a long time. We were able to cover most of the cases. But the user’s needs are different now and they are much more challenging. List designs became more and more complex and the ListView wasn’t helping with handling them. Material Design brought other changes, too – it’s beautiful but complex.
Fortunately, the RecyclerView was introduced and a lot of problems were solved. It’s more efficient by default, its animations are simpler, layouting it’s easier to use and the API is much nicer. So, if you ever wonder which one you should choose, your first thought should be the RecyclerView. I hope this article helped you to understand what is the difference between ListView and RecyclerView.