I am using RecyclerView to display text in CardView but I want to add a Header TextView at the top of the RecyclerView that looks like this:
Have to create different type of View holder and also have bind the data according to view holder views. This Question is already asked and answer Recyclerview and handling different type of row inflation here and it will help you
If you want to add multiple types of views (more than 2 types) and not just a header
and "normal" item
, CommonsWare answer is perfect. But if the two mentioned types (header
and item
) are enough for you, the answer can be a lot simpler (from the practical point of view).
There are two relatively simple libraries that you can use for that:
RecyclerViewHeader - super simple to use, but uses a bit "hacky" approach, that sometimes can cause problems. Suitable for relatively simple headers.
HeaderRecyclerView - Suitable for any type of header. Implements approach mentioned by CommonsWare to inflate two types of views. A bit more difficult to use than RecyclerViewHeader
but nothing too hard to use on a daily basis.
For disclosure: I am the author of the RecyclerViewHeader. I'm aware of its flaws, therefore I'm not trying to promote it as one-for-all solution, but more as an interesting alternative to complicating your adapter. HeaderRecyclerView is a nice piece of code that can simplify your work. I use it myself when my RecyclerView
header gets complicated.
You need to make three changes:
Implement getItemViewType()
on your RecyclerView.Adapter
, to return a unique integer for each view type needed by your app, based on the supplied position
. So, you would return one value for your header (presumably a position
of 0
) and another value for everything else.
Pay attention to the viewType
parameter passed into onCreateViewHolder()
, and create an appropriate RecyclerView.ViewHolder
as needed. This in turn probably means that you should have different ViewHolder
classes for your header and detail rows.
In onBindViewHolder()
, apply binding logic based upon the type of the ViewHolder
that you get, so you bind the appropriate data into the ViewHolder
. You can use instanceof
, or have the ViewHolder
classes implement a common interface, or whatever to make this work.
This sample app demonstrates a RecyclerView
with section headers that implements the above steps.