RecyclerView.ViewHolder
public
static
abstract
class
RecyclerView.ViewHolder
extends Object
java.lang.Object | |
↳ | androidx.recyclerview.widget.RecyclerView.ViewHolder |
A ViewHolder describes an item view and metadata about its place within the RecyclerView.
RecyclerView.Adapter
implementations should subclass ViewHolder and add fields for caching
potentially expensive View.findViewById(int)
results.
While RecyclerView.LayoutParams
belong to the RecyclerView.LayoutManager
,
ViewHolders
belong to the adapter. Adapters should feel free to use
their own custom ViewHolder implementations to store data that makes binding view contents
easier. Implementations should assume that individual item views will hold strong references
to ViewHolder
objects and that RecyclerView
instances may hold
strong references to extra off-screen item views for caching purposes
Summary
Fields | |
---|---|
public
final
View |
itemView
|
Public constructors | |
---|---|
ViewHolder(View itemView)
|
Public methods | |
---|---|
final
int
|
getAbsoluteAdapterPosition()
Returns the Adapter position of the item represented by this ViewHolder with respect to
the |
final
int
|
getAdapterPosition()
This method is deprecated.
This method is confusing when adapters nest other adapters.
If you are calling this in the context of an Adapter, you probably want to call
|
final
Adapter<? extends RecyclerView.ViewHolder>
|
getBindingAdapter()
Returns the |
final
int
|
getBindingAdapterPosition()
Returns the Adapter position of the item represented by this ViewHolder with respect to
the |
final
long
|
getItemId()
Returns The itemId represented by this ViewHolder. |
final
int
|
getItemViewType()
|
final
int
|
getLayoutPosition()
Returns the position of the ViewHolder in terms of the latest layout pass. |
final
int
|
getOldPosition()
When LayoutManager supports animations, RecyclerView tracks 3 positions for ViewHolders to perform animations. |
final
int
|
getPosition()
This method is deprecated.
This method is deprecated because its meaning is ambiguous due to the async
handling of adapter updates. You should use |
final
boolean
|
isRecyclable()
|
final
void
|
setIsRecyclable(boolean recyclable)
Informs the recycler whether this item can be recycled. |
String
|
toString()
|
Inherited methods | |
---|---|
Fields
Public constructors
Public methods
getAbsoluteAdapterPosition
public final int getAbsoluteAdapterPosition ()
Returns the Adapter position of the item represented by this ViewHolder with respect to
the RecyclerView
's RecyclerView.Adapter
. If the RecyclerView.Adapter
that bound this
RecyclerView.ViewHolder
is inside another adapter (e.g. ConcatAdapter
), this
position might be different and will include
the offsets caused by other adapters in the ConcatAdapter
.
Note that this might be different than the getLayoutPosition()
if there are
pending adapter updates but a new layout pass has not happened yet.
RecyclerView does not handle any adapter updates until the next layout traversal. This may create temporary inconsistencies between what user sees on the screen and what adapter contents have. This inconsistency is not important since it will be less than 16ms but it might be a problem if you want to use ViewHolder position to access the adapter. Sometimes, you may need to get the exact adapter position to do some actions in response to user events. In that case, you should use this method which will calculate the Adapter position of the ViewHolder.
Note that if you've called RecyclerView.Adapter.notifyDataSetChanged()
, until the
next layout pass, the return value of this method will be RecyclerView.NO_POSITION
.
Note that if you are querying the position as RecyclerView
sees, you should use
getAbsoluteAdapterPosition()
(e.g. you want to use it to save scroll
state). If you are querying the position to access the RecyclerView.Adapter
contents,
you should use getBindingAdapterPosition()
.
Returns | |
---|---|
int |
The adapter position of the item from RecyclerView 's perspective if it
still exists in the adapter and bound to a valid item.
RecyclerView.NO_POSITION if item has been removed from the adapter,
RecyclerView.Adapter.notifyDataSetChanged() has been called after the last
layout pass or the ViewHolder has already been recycled. |
getAdapterPosition
public final int getAdapterPosition ()
This method is deprecated.
This method is confusing when adapters nest other adapters.
If you are calling this in the context of an Adapter, you probably want to call
getBindingAdapterPosition()
or if you want the position as RecyclerView
sees it, you should call getAbsoluteAdapterPosition()
.
Returns | |
---|---|
int |
getBindingAdapterPosition() |
getBindingAdapter
public final Adapter<? extends RecyclerView.ViewHolder> getBindingAdapter ()
Returns the RecyclerView.Adapter
that last bound this RecyclerView.ViewHolder
.
Might return null
if this RecyclerView.ViewHolder
is not bound to any adapter.
Returns | |
---|---|
Adapter<? extends RecyclerView.ViewHolder> |
The RecyclerView.Adapter that last bound this RecyclerView.ViewHolder or null if
this RecyclerView.ViewHolder is not bound by any adapter (e.g. recycled).
|
getBindingAdapterPosition
public final int getBindingAdapterPosition ()
Returns the Adapter position of the item represented by this ViewHolder with respect to
the RecyclerView.Adapter
that bound it.
Note that this might be different than the getLayoutPosition()
if there are
pending adapter updates but a new layout pass has not happened yet.
RecyclerView does not handle any adapter updates until the next layout traversal. This may create temporary inconsistencies between what user sees on the screen and what adapter contents have. This inconsistency is not important since it will be less than 16ms but it might be a problem if you want to use ViewHolder position to access the adapter. Sometimes, you may need to get the exact adapter position to do some actions in response to user events. In that case, you should use this method which will calculate the Adapter position of the ViewHolder.
Note that if you've called RecyclerView.Adapter.notifyDataSetChanged()
, until the
next layout pass, the return value of this method will be RecyclerView.NO_POSITION
.
If the RecyclerView.Adapter
that bound this RecyclerView.ViewHolder
is inside another
RecyclerView.Adapter
(e.g. ConcatAdapter
), this position might be different than
getAbsoluteAdapterPosition()
. If you would like to know the position that
RecyclerView
considers (e.g. for saved state), you should use
getAbsoluteAdapterPosition()
.
Returns | |
---|---|
int |
The adapter position of the item if it still exists in the adapter.
RecyclerView.NO_POSITION if item has been removed from the adapter,
RecyclerView.Adapter.notifyDataSetChanged() has been called after the last
layout pass or the ViewHolder has already been recycled. |
getItemId
public final long getItemId ()
Returns The itemId represented by this ViewHolder.
Returns | |
---|---|
long |
The item's id if adapter has stable ids, RecyclerView.NO_ID
otherwise
|
getItemViewType
public final int getItemViewType ()
Returns | |
---|---|
int |
The view type of this ViewHolder. |
getLayoutPosition
public final int getLayoutPosition ()
Returns the position of the ViewHolder in terms of the latest layout pass.
This position is mostly used by RecyclerView components to be consistent while RecyclerView lazily processes adapter updates.
For performance and animation reasons, RecyclerView batches all adapter updates until the next layout pass. This may cause mismatches between the Adapter position of the item and the position it had in the latest layout calculations.
LayoutManagers should always call this method while doing calculations based on item
positions. All methods in RecyclerView.LayoutManager
, RecyclerView.State
,
RecyclerView.Recycler
that receive a position expect it to be the layout position
of the item.
If LayoutManager needs to call an external method that requires the adapter position of
the item, it can use getAbsoluteAdapterPosition()
or
RecyclerView.Recycler.convertPreLayoutPositionToPostLayout(int)
.
Returns | |
---|---|
int |
Returns the adapter position of the ViewHolder in the latest layout pass. |
getOldPosition
public final int getOldPosition ()
When LayoutManager supports animations, RecyclerView tracks 3 positions for ViewHolders to perform animations.
If a ViewHolder was laid out in the previous onLayout call, old position will keep its adapter index in the previous layout.
Returns | |
---|---|
int |
The previous adapter index of the Item represented by this ViewHolder or
RecyclerView.NO_POSITION if old position does not exists or cleared (pre-layout is
complete).
|
getPosition
public final int getPosition ()
This method is deprecated.
This method is deprecated because its meaning is ambiguous due to the async
handling of adapter updates. You should use getLayoutPosition()
,
getBindingAdapterPosition()
or getAbsoluteAdapterPosition()
depending on your use case.
Returns | |
---|---|
int |
isRecyclable
public final boolean isRecyclable ()
Returns | |
---|---|
boolean |
true if this item is available to be recycled, false otherwise. |
See also:
setIsRecyclable
public final void setIsRecyclable (boolean recyclable)
Informs the recycler whether this item can be recycled. Views which are not recyclable will not be reused for other items until setIsRecyclable() is later set to true. Calls to setIsRecyclable() should always be paired (one call to setIsRecyclabe(false) should always be matched with a later call to setIsRecyclable(true)). Pairs of calls may be nested, as the state is internally reference-counted.
Parameters | |
---|---|
recyclable |
boolean : Whether this item is available to be recycled. Default value
is true. |
See also:
toString
public String toString ()
Returns | |
---|---|
String |