What's the enhancement of RecyclerView over ListView?
And what exactly is the enhancement of RecyclerView over ListView?
RecyclerView
is not an "enhancement" "over ListView
", strictly speaking. ListView
actually does something; RecyclerView
, on its own, does not. A more accurate comparison would be that the RecyclerView
framework is an improvement over AdapterView
, and to some extent the AbsListView
parent class of ListView
and GridView
.
RecyclerView
focuses on widget recycling and gross child View
management. It delegates everything else to other classes. AdapterView
does far less of this, making it more difficult to extend functionally.
Of note:
Laying out the children, within the scrollable space of the
RecyclerView
, is delegated to managers. Hence, not only do three ship withrecyclerview-v7
(list, grid, staggered grid), but others can be developed for alternative scenarios (e.g., overlapping children, for aStackView
orGallery
sort of experience).Updates from adapters can be much more fine-grained. With
AdapterView
, you pretty much have to redraw the entire view (e.g., aListView
and all its rows) on any change of significance, especially when adding and removing items. The update mechanism in theRecyclerView
adapters indicate the specific positions that change. Not only does this require less processing time, but it helps enable the animated effects thatRecyclerView
offers (again, with pluggable replacements) for adding, moving, and removing items.Other stuff that was "baked into"
ListView
, like drawing dividers, is now pulled out into extension points, such as anItemDecorator
. Now, you can choose how to "decorate" items, with line dividers or boxes or colored bar separators or whatever. Decoration is not limited to "dividers", but can affect anything in the views that, for one reason or another, you consider to be separate from the item views themselves.
RecyclerView
, though, is fairly complicated to get going. What you get from ListView
"out of the box" takes a lot more code -- yours or a third-party library's -- to match. For experienced developers, this is a feature, in that the code is replaceable with other code. For newcomers, this is a bug, in that there is a steeper learning curve for RecyclerView
, IMHO.
As per the official documentation RecyclerView
is a major enhancement over ListView
. It contains many new features like ViewHolder
, ItemDecorator
, LayoutManager
, and SmoothScroller
. But one thing that certainly gives it an edge over the ListView
is; the ability to have animations while adding or removing an item.
View Holders
In
ListView
, defining view holders was a suggested approach for keeping references for views. But it was not a compulsion. Although by not doing so,ListView
used show stale data. Another major drawback of not using view holders could lead to a heavy operation of finding views by ids every time. Which resulted in laggyListView
s.This problem is solved in
RecylerView
by the use of RecyclerView.ViewHolder class. This is one of the major differences inRecyclerView
andListView
. When implementing aRecyclerView
this class is used to define aViewHolder
object which is used by the adapter to bindViewHolder
with a position. Another point to be noted here, is that while implementing the adapter forRecyclerView
, providing aViewHolder
is compulsory. This makes the implementation a little complex, but solves the issues faced inListView
.
Layout Manager
When speaking of
ListView
s, only one type ofListView
is available i.e. the verticalListView
. You cannot implement aListView
with horizontal scroll. I know there are ways to implement a horizontal scroll, but believe me it was not designed to work that way.But now when we look at Android
RecyclerView
vsListView
, we have support for horizontal collections as well. In-fact it supports multiple types of lists. To support multiple types of lists it usesRecyclerView.LayoutManager
class. This is something new that ListView does not have.RecyclerView
supports three types of predefined Layout Managers:LinearLayoutManager – This is the most commonly used layout manager in case of RecyclerView. Through this, we can create both horizontal and vertical scroll lists.
StaggeredGridLayoutManager – Through this layout manager, we can create staggered lists. Just like the Pinterest screen.
GridLayoutManager– This layout manager can be used to display grids, like any picture gallery.
Item Animator
Animations in a list is a whole new dimension, which has endless possibilities. In a ListView, as such there are no special provisions through which one can animate, addition or deletion of items. Instead later on as android evolved ViewPropertyAnimator was suggested by Google’s Chet Haase in this video tutorial for animations in
ListView
. On the other hand comparing AndroidRecyclerView
vsListView
, it has RecyclerView.ItemAnimator class for handling animations. Through this class custom animations can be defined for item addition, deletion and move events. Also it provides a DefaultItemAnimator, in case you don’t need any customizations.
Adapter
ListView
adapters were simple to implement. They had a main methodgetView
where all the magic used to happen. Where the views were bound to a position. Also they used to have an interesting method registerDataSetObserver where one can set an observer right in the adapter. This feature is also present in RecyclerView, but RecyclerView.AdapterDataObserver class is used for it. But the point in favor of ListView is that it supports three default implementations of adapters:ArrayAdapter
CursorAdapter
SimpleCursorAdapter
WhereasRecyclerView
adapter, has all the functionality thatListView
adapters had except the built in support for DB cursors and ArrayLists. InRecyclerView.Adapter
as of now we have to make a custom implementation to supply data to the adapter. Just like a BaseAdapter does forListView
s. Although if you wish to know more aboutRecyclerView
adapter implementation, please refer to Android RecyclerView Example.
Item Decoration
To display custom dividers in a ListView, one could have easily added these parameters in the ListView XML:
android:divider="@android:color/transparent"
android:dividerHeight="5dp"
The interesting part about Android RecyclerView is that, as of now it does not show a divider between items by default. Although the guys at Google must have left this out for customization, intentionally. But this greatly increases the effort for a developer. If you wish to add a divider between items, you may need to do a custom implementation by using RecyclerView.ItemDecoration class. Or you can apply a hack by using this file from official samples: DividerItemDecoration.java