FragmentStateAdapter
public
abstract
class
FragmentStateAdapter
extends Adapter<FragmentViewHolder>
implements
StatefulAdapter
java.lang.Object | ||
↳ | androidx.recyclerview.widget.RecyclerView.Adapter<androidx.viewpager2.adapter.FragmentViewHolder> | |
↳ | androidx.viewpager2.adapter.FragmentStateAdapter |
Similar in behavior to FragmentStatePagerAdapter
Lifecycle within RecyclerView
:
RecyclerView.ViewHolder
initially an emptyFrameLayout
, serves as a re-usable container for aFragment
in later stages.RecyclerView.Adapter.onBindViewHolder(VH, int)
we ask for aFragment
for the position. If we already have the fragment, or have previously saved its state, we use those.RecyclerView.onAttachedToWindow()
we attach theFragment
to a container.RecyclerView.Adapter.onViewRecycled(VH)
we remove, save state, destroy theFragment
.
Summary
Nested classes | |
---|---|
class |
FragmentStateAdapter.FragmentTransactionCallback
Callback interface for listening to fragment lifecycle changes that happen inside the adapter. |
Public constructors | |
---|---|
FragmentStateAdapter(FragmentActivity fragmentActivity)
|
|
FragmentStateAdapter(Fragment fragment)
|
|
FragmentStateAdapter(FragmentManager fragmentManager, Lifecycle lifecycle)
|
Public methods | |
---|---|
boolean
|
containsItem(long itemId)
Default implementation works for collections that don't add, move, remove items. |
abstract
Fragment
|
createFragment(int position)
Provide a new Fragment associated with the specified position. |
long
|
getItemId(int position)
Default implementation works for collections that don't add, move, remove items. |
void
|
onAttachedToRecyclerView(RecyclerView recyclerView)
Called by RecyclerView when it starts observing this Adapter. |
final
void
|
onBindViewHolder(FragmentViewHolder holder, int position)
Called by RecyclerView to display the data at the specified position. |
final
FragmentViewHolder
|
onCreateViewHolder(ViewGroup parent, int viewType)
Called when RecyclerView needs a new |
void
|
onDetachedFromRecyclerView(RecyclerView recyclerView)
Called by RecyclerView when it stops observing this Adapter. |
final
boolean
|
onFailedToRecycleView(FragmentViewHolder holder)
Called by the RecyclerView if a ViewHolder created by this Adapter cannot be recycled due to its transient state. |
final
void
|
onViewAttachedToWindow(FragmentViewHolder holder)
Called when a view created by this adapter has been attached to a window. |
final
void
|
onViewRecycled(FragmentViewHolder holder)
Called when a view created by this adapter has been recycled. |
void
|
registerFragmentTransactionCallback(FragmentStateAdapter.FragmentTransactionCallback callback)
Registers a |
final
void
|
restoreState(Parcelable savedState)
Restores adapter state |
final
Parcelable
|
saveState()
Saves adapter state |
final
void
|
setHasStableIds(boolean hasStableIds)
Indicates whether each item in the data set can be represented with a unique identifier
of type |
void
|
unregisterFragmentTransactionCallback(FragmentStateAdapter.FragmentTransactionCallback callback)
Unregisters a |
Inherited methods | |
---|---|
Public constructors
FragmentStateAdapter
public FragmentStateAdapter (FragmentActivity fragmentActivity)
Parameters | |
---|---|
fragmentActivity |
FragmentActivity : if the ViewPager2 lives directly in a
FragmentActivity subclass. |
FragmentStateAdapter
public FragmentStateAdapter (Fragment fragment)
Parameters | |
---|---|
fragment |
Fragment : if the ViewPager2 lives directly in a Fragment subclass. |
FragmentStateAdapter
public FragmentStateAdapter (FragmentManager fragmentManager, Lifecycle lifecycle)
Parameters | |
---|---|
fragmentManager |
FragmentManager : of ViewPager2 's host |
lifecycle |
Lifecycle : of ViewPager2 's host |
Public methods
containsItem
public boolean containsItem (long itemId)
Default implementation works for collections that don't add, move, remove items.
When overriding, also override getItemId(int)
Parameters | |
---|---|
itemId |
long |
Returns | |
---|---|
boolean |
createFragment
public abstract Fragment createFragment (int position)
Provide a new Fragment associated with the specified position.
The adapter will be responsible for the Fragment lifecycle:
- The Fragment will be used to display an item.
- The Fragment will be destroyed when it gets too far from the viewport, and its state will be saved. When the item is close to the viewport again, a new Fragment will be requested, and a previously saved state will be used to initialize it.
Parameters | |
---|---|
position |
int |
Returns | |
---|---|
Fragment |
See also:
getItemId
public long getItemId (int position)
Default implementation works for collections that don't add, move, remove items.
When overriding, also override containsItem(long)
.
If the item is not a part of the collection, return RecyclerView.NO_ID
.
Parameters | |
---|---|
position |
int : Adapter position |
Returns | |
---|---|
long |
stable item id RecyclerView.Adapter.hasStableIds()
|
onAttachedToRecyclerView
public void onAttachedToRecyclerView (RecyclerView recyclerView)
Called by RecyclerView when it starts observing this Adapter.
Keep in mind that same adapter may be observed by multiple RecyclerViews.
Parameters | |
---|---|
recyclerView |
RecyclerView : The RecyclerView instance which started observing this adapter. |
onBindViewHolder
public final void onBindViewHolder (FragmentViewHolder holder, int position)
Called by RecyclerView to display the data at the specified position. This method should
update the contents of the RecyclerView.ViewHolder.itemView
to reflect the item at the given
position.
Note that unlike ListView
, RecyclerView will not call this method
again if the position of the item changes in the data set unless the item itself is
invalidated or the new position cannot be determined. For this reason, you should only
use the position
parameter while acquiring the related data item inside
this method and should not keep a copy of it. If you need the position of an item later
on (e.g. in a click listener), use RecyclerView.ViewHolder.getBindingAdapterPosition()
which
will have the updated adapter position.
Override onBindViewHolder(ViewHolder, int, List)
instead if Adapter can
handle efficient partial bind.
Parameters | |
---|---|
holder |
FragmentViewHolder : The ViewHolder which should be updated to represent the contents of the
item at the given position in the data set. |
position |
int : The position of the item within the adapter's data set.
|
onCreateViewHolder
public final FragmentViewHolder onCreateViewHolder (ViewGroup parent, int viewType)
Called when RecyclerView needs a new RecyclerView.ViewHolder
of the given type to represent
an item.
This new ViewHolder should be constructed with a new View that can represent the items of the given type. You can either create a new View manually or inflate it from an XML layout file.
The new ViewHolder will be used to display items of the adapter using
onBindViewHolder(ViewHolder, int, List)
. Since it will be re-used to display
different items in the data set, it is a good idea to cache references to sub views of
the View to avoid unnecessary View.findViewById(int)
calls.
Parameters | |
---|---|
parent |
ViewGroup : The ViewGroup into which the new View will be added after it is bound to
an adapter position. |
viewType |
int : The view type of the new View. |
Returns | |
---|---|
FragmentViewHolder |
A new ViewHolder that holds a View of the given view type. |
onDetachedFromRecyclerView
public void onDetachedFromRecyclerView (RecyclerView recyclerView)
Called by RecyclerView when it stops observing this Adapter.
Parameters | |
---|---|
recyclerView |
RecyclerView : The RecyclerView instance which stopped observing this adapter. |
onFailedToRecycleView
public final boolean onFailedToRecycleView (FragmentViewHolder holder)
Called by the RecyclerView if a ViewHolder created by this Adapter cannot be recycled
due to its transient state. Upon receiving this callback, Adapter can clear the
animation(s) that effect the View's transient state and return true
so that
the View can be recycled. Keep in mind that the View in question is already removed from
the RecyclerView.
In some cases, it is acceptable to recycle a View although it has transient state. Most
of the time, this is a case where the transient state will be cleared in
onBindViewHolder(ViewHolder, int)
call when View is rebound to a new position.
For this reason, RecyclerView leaves the decision to the Adapter and uses the return
value of this method to decide whether the View should be recycled or not.
Note that when all animations are created by RecyclerView.ItemAnimator
, you
should never receive this callback because RecyclerView keeps those Views as children
until their animations are complete. This callback is useful when children of the item
views create animations which may not be easy to implement using an RecyclerView.ItemAnimator
.
You should never fix this issue by calling
holder.itemView.setHasTransientState(false);
unless you've previously called
holder.itemView.setHasTransientState(true);
. Each
View.setHasTransientState(true)
call must be matched by a
View.setHasTransientState(false)
call, otherwise, the state of the View
may become inconsistent. You should always prefer to end or cancel animations that are
triggering the transient state instead of handling it manually.
Parameters | |
---|---|
holder |
FragmentViewHolder : The ViewHolder containing the View that could not be recycled due to its
transient state. |
Returns | |
---|---|
boolean |
True if the View should be recycled, false otherwise. Note that if this method
returns true , RecyclerView will ignore the transient state of
the View and recycle it regardless. If this method returns false ,
RecyclerView will check the View's transient state again before giving a final decision.
Default implementation returns false.
|
onViewAttachedToWindow
public final void onViewAttachedToWindow (FragmentViewHolder holder)
Called when a view created by this adapter has been attached to a window.
This can be used as a reasonable signal that the view is about to be seen
by the user. If the adapter previously freed any resources in
onViewDetachedFromWindow
those resources should be restored here.
Parameters | |
---|---|
holder |
FragmentViewHolder : Holder of the view being attached
|
onViewRecycled
public final void onViewRecycled (FragmentViewHolder holder)
Called when a view created by this adapter has been recycled.
A view is recycled when a RecyclerView.LayoutManager
decides that it no longer
needs to be attached to its parent RecyclerView
. This can be because it has
fallen out of visibility or a set of cached views represented by views still
attached to the parent RecyclerView. If an item view has large or expensive data
bound to it such as large bitmaps, this may be a good place to release those
resources.
RecyclerView calls this method right before clearing ViewHolder's internal data and
sending it to RecycledViewPool. This way, if ViewHolder was holding valid information
before being recycled, you can call RecyclerView.ViewHolder.getBindingAdapterPosition()
to get
its adapter position.
Parameters | |
---|---|
holder |
FragmentViewHolder : The ViewHolder for the view being recycled
|
registerFragmentTransactionCallback
public void registerFragmentTransactionCallback (FragmentStateAdapter.FragmentTransactionCallback callback)
Registers a FragmentStateAdapter.FragmentTransactionCallback
to listen to fragment lifecycle changes
that happen inside the adapter.
Parameters | |
---|---|
callback |
FragmentStateAdapter.FragmentTransactionCallback : Callback to register
|
restoreState
public final void restoreState (Parcelable savedState)
Restores adapter state
Parameters | |
---|---|
savedState |
Parcelable |
setHasStableIds
public final void setHasStableIds (boolean hasStableIds)
Indicates whether each item in the data set can be represented with a unique identifier
of type Long
.
Parameters | |
---|---|
hasStableIds |
boolean : Whether items in data set have unique identifiers or not. |
unregisterFragmentTransactionCallback
public void unregisterFragmentTransactionCallback (FragmentStateAdapter.FragmentTransactionCallback callback)
Unregisters a FragmentStateAdapter.FragmentTransactionCallback
.
Parameters | |
---|---|
callback |
FragmentStateAdapter.FragmentTransactionCallback : Callback to unregister |
Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2021-02-24 UTC.