Most visited

Recently visited

RecyclerView.Adapter

public static abstract class RecyclerView.Adapter
extends Object

java.lang.Object
   ↳ android.support.v7.widget.RecyclerView.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder>
Known Direct Subclasses


适配器的基类

适配器提供从应用程序特定数据集到在 RecyclerView内显示的视图的 RecyclerView

Summary

Public constructors

RecyclerView.Adapter()

Public methods

final void bindViewHolder(VH holder, int position)

此方法内部调用 onBindViewHolder(ViewHolder, int)以更新 RecyclerView.ViewHolder内容与给定位置的项目,并设置一些专用字段供RecyclerView使用。

final VH createViewHolder(ViewGroup parent, int viewType)

此方法调用 onCreateViewHolder(ViewGroup, int)以创建新的 RecyclerView.ViewHolder并初始化RecyclerView要使用的一些专用字段。

abstract int getItemCount()

返回适配器持有的数据集中的项目总数。

long getItemId(int position)

position返回商品的稳定ID。

int getItemViewType(int position)

为了查看回收目的,返回物品的视图类型 position

final boolean hasObservers()

如果一个或多个观察者连接到此适配器,则返回true。

final boolean hasStableIds()

如果此适配器发布唯一 long值,则该值可以充当数据集中给定位置的项目的键,则返回true。

final void notifyDataSetChanged()

通知任何注册的观察员数据集已更改。

final void notifyItemChanged(int position, Object payload)

通知任何注册的观察者, position的项目已经改变了可选的有效载荷对象。

final void notifyItemChanged(int position)

通知任何注册的观察员, position的项目已更改。

final void notifyItemInserted(int position)

通知任何注册的观察员,该项目反映在 position已新插入。

final void notifyItemMoved(int fromPosition, int toPosition)

通知任何注册的观察员,该项目反映在 fromPosition已被移至 toPosition

final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload)

通知所有注册的观察者,该 itemCount项目开始位置 positionStart已经改变。

final void notifyItemRangeChanged(int positionStart, int itemCount)

通知任何注册的观察员,从位置 positionStart开始的 itemCount项目已更改。

final void notifyItemRangeInserted(int positionStart, int itemCount)

通知所有注册了的观察是,目前反映 itemCount项目开始 positionStart已经被新插入。

final void notifyItemRangeRemoved(int positionStart, int itemCount)

通知任何注册的观察员,以前位于 positionStartitemCount项目已从数据集中删除。

final void notifyItemRemoved(int position)

通知任何注册的观察员,该项目以前位于 position已从数据集中删除。

void onAttachedToRecyclerView(RecyclerView recyclerView)

当它开始观察此适配器时,由RecyclerView调用。

abstract void onBindViewHolder(VH holder, int position)

由RecyclerView调用以在指定位置显示数据。

void onBindViewHolder(VH holder, int position, List<Object> payloads)

由RecyclerView调用以在指定位置显示数据。

abstract VH onCreateViewHolder(ViewGroup parent, int viewType)

当RecyclerView需要一个新的给定类型的 RecyclerView.ViewHolder来表示一个项目时调用。

void onDetachedFromRecyclerView(RecyclerView recyclerView)

当它停止观察此适配器时,由RecyclerView调用。

boolean onFailedToRecycleView(VH holder)

如果由此适配器创建的ViewHolder由于其瞬态状态而无法回收,则由RecyclerView调用。

void onViewAttachedToWindow(VH holder)

当此适配器创建的视图已附加到窗口时调用。

void onViewDetachedFromWindow(VH holder)

当此适配器创建的视图已从其窗口分离时调用。

void onViewRecycled(VH holder)

当此适配器创建的视图已被回收时调用。

void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer)

注册一个新的观察者来监听数据更改。

void setHasStableIds(boolean hasStableIds)

指示数据集中的每个项目是否可以用类型 Long的唯一标识符表示。

void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer)

取消注册当前正在侦听数据更改的观察者。

Inherited methods

From class java.lang.Object

Public constructors

RecyclerView.Adapter

RecyclerView.Adapter ()

Public methods

bindViewHolder

void bindViewHolder (VH holder, 
                int position)

此方法内部调用 onBindViewHolder(ViewHolder, int)以更新 RecyclerView.ViewHolder内容与给定位置的项目,并设置一些专用字段供RecyclerView使用。

Parameters
holder VH
position int

也可以看看:

createViewHolder

VH createViewHolder (ViewGroup parent, 
                int viewType)

此方法调用 onCreateViewHolder(ViewGroup, int)以创建新的 RecyclerView.ViewHolder并初始化RecyclerView要使用的一些专用字段。

Parameters
parent ViewGroup
viewType int
Returns
VH

也可以看看:

getItemCount

int getItemCount ()

返回适配器持有的数据集中的项目总数。

Returns
int The total number of items in this adapter.

getItemId

long getItemId (int position)

position返回商品的稳定ID。 如果hasStableIds()将返回false,则此方法应返回NO_ID 此方法的默认实现返回NO_ID

Parameters
position int: Adapter position to query
Returns
long the stable ID of the item at position

getItemViewType

int getItemViewType (int position)

为了查看回收目的,返回物品的视图类型 position

此方法的默认实现返回0,假定适配器的单一视图类型。 与ListView适配器不同,类型不需要是连续的。 考虑使用id资源来唯一标识项目视图类型。

Parameters
position int: position to query
Returns
int integer value identifying the type of the view needed to represent the item at position. Type codes need not be contiguous.

hasObservers

boolean hasObservers ()

如果一个或多个观察者连接到此适配器,则返回true。

Returns
boolean true if this adapter has observers

hasStableIds

boolean hasStableIds ()

如果此适配器发布唯一的long值,则该值可以充当数据集中给定位置处的项目的键,则返回true。 如果该项目重新放置在数据集中,则为该项目返回的ID应该相同。

Returns
boolean true if this adapter's items have stable IDs

notifyDataSetChanged

void notifyDataSetChanged ()

通知任何注册的观察员数据集已更改。

有两类不同的数据更改事件,项目更改和结构更改。 项目更改是指单个项目更新其数据但未发生位置更改时。 结构更改是指在数据集中插入,移除或移动项目时。

此事件没有指定数据集已更改的内容,强制任何观察者都假定所有现有项目和结构可能不再有效。 LayoutManagers将被迫完全重新绑定并重新布局所有可见的视图。

RecyclerView将尝试为适配器合成可见的结构更改事件,该适配器在使用此方法时报告它们具有stable IDs 这可以帮助实现动画和视觉对象持久化的目的,但单个项目视图仍然需要反弹并重新布局。

如果您正在编写适配器,那么如果可以的话,使用更具体的更改事件总是更加高效。 依靠notifyDataSetChanged()作为最后的手段。

也可以看看:

notifyItemChanged

void notifyItemChanged (int position, 
                Object payload)

通知任何注册的观察者, position的项目已经改变了可选的有效载荷对象。

这是项目更改事件,而不是结构更改事件。 它表明任何对position数据的position都是过时的,应该更新。 position的项目保留相同的身份。

客户端可以选择传递有效负载以进行部分更改 这些有效载荷将被合并,并且如果该项目已经由ViewHolder表示并且将被回弹到相同的onBindViewHolder(ViewHolder, int, List)则可以将其传递到适配器onBindViewHolder(ViewHolder, int, List) 具有空有效载荷的notifyItemRangeChanged()将清除该项目上的所有现有有效载荷,并阻止将来的有效载荷,直到onBindViewHolder(ViewHolder, int, List) 适配器不应该假定有效负载将总是传递给onBindViewHolder(),例如,当视图未连接时,负载将被简单地删除。

Parameters
position int: Position of the item that has changed
payload Object: Optional parameter, use null to identify a "full" update

也可以看看:

notifyItemChanged

void notifyItemChanged (int position)

通知任何注册的观察员, position项目已更改。 相当于致电notifyItemChanged(position, null);

这是项目更改事件,而不是结构更改事件。 它表明任何对position数据的position都是过时的,应该更新。 position的项目保留相同的身份。

Parameters
position int: Position of the item that has changed

也可以看看:

notifyItemInserted

void notifyItemInserted (int position)

通知任何注册的观察员,该项目反映在position已被新插入。 此前在position的项目现在位于position + 1

这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。

Parameters
position int: Position of the newly inserted item in the data set

也可以看看:

notifyItemMoved

void notifyItemMoved (int fromPosition, 
                int toPosition)

通知任何注册的观察员,该项目反映在 fromPosition已被移至 toPosition

这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。

Parameters
fromPosition int: Previous position of the item.
toPosition int: New position of the item.

notifyItemRangeChanged

void notifyItemRangeChanged (int positionStart, 
                int itemCount, 
                Object payload)

通知所有注册的观察者,该itemCount项目开始位置positionStart已经改变。 可选的有效负载可以传递给每个更改的项目。

这是项目更改事件,而不是结构更改事件。 它表明,在给定位置范围内的数据的任何反映都是过时的,应该更新。 给定范围内的项目保留相同的身份。

客户端可以选择传递有效负载以进行部分更改 这些有效载荷将被合并,并且如果该项目已经由ViewHolder表示并且将被回弹到相同的onBindViewHolder(ViewHolder, int, List)则可以将其传递到适配器onBindViewHolder(ViewHolder, int, List) 具有空有效载荷的notifyItemRangeChanged()将清除该项目上的所有现有有效载荷,并阻止将来的有效载荷,直到onBindViewHolder(ViewHolder, int, List) 适配器不应该假定有效负载将总是传递给onBindViewHolder(),例如,当视图未连接时,负载将被简单地删除。

Parameters
positionStart int: Position of the first item that has changed
itemCount int: Number of items that have changed
payload Object: Optional parameter, use null to identify a "full" update

也可以看看:

notifyItemRangeChanged

void notifyItemRangeChanged (int positionStart, 
                int itemCount)

通知所有注册的观察者,该itemCount项目开始位置positionStart已经改变。 相当于拨打notifyItemRangeChanged(position, itemCount, null);

这是项目更改事件,而不是结构更改事件。 它表明,在给定位置范围内的数据的任何反映都是过时的,应该更新。 给定范围内的项目保留相同的身份。

Parameters
positionStart int: Position of the first item that has changed
itemCount int: Number of items that have changed

也可以看看:

notifyItemRangeInserted

void notifyItemRangeInserted (int positionStart, 
                int itemCount)

通知所有注册了的观察是,目前反映itemCount项目开始positionStart已经被新插入。 以前位于positionStart及以后的物品现在可以从positionStart + itemCount位置开始找到。

这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。

Parameters
positionStart int: Position of the first item that was inserted
itemCount int: Number of items inserted

也可以看看:

notifyItemRangeRemoved

void notifyItemRangeRemoved (int positionStart, 
                int itemCount)

通知任何注册的观察员,以前位于positionStartitemCount项目已从数据集中删除。 以前位于positionStart + itemCount之后的positionStart + itemCount现在可以在oldPosition - itemCount找到。

这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。

Parameters
positionStart int: Previous position of the first item that was removed
itemCount int: Number of items removed from the data set

notifyItemRemoved

void notifyItemRemoved (int position)

通知任何注册的观察员,以前位于position的项目已从数据集中删除。 之前位于position之后的position现在可以在oldPosition - 1找到。

这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。

Parameters
position int: Position of the item that has now been removed

也可以看看:

onAttachedToRecyclerView

void onAttachedToRecyclerView (RecyclerView recyclerView)

当它开始观察此适配器时,由RecyclerView调用。

请记住,多个RecyclerViews可能会观察到相同的适配器。

Parameters
recyclerView RecyclerView: The RecyclerView instance which started observing this adapter.

也可以看看:

onBindViewHolder

void onBindViewHolder (VH holder, 
                int position)

由RecyclerView调用以在指定位置显示数据。 此方法应更新itemView的内容以反映给定位置处的项目。

请注意,与ListView不同,如果物品的位置在数据集中发生更改,RecyclerView将不会再次调用此方法,除非物品本身无效或无法确定新位置。 出于这个原因,您应该只使用position参数,同时获取此方法中的相关数据项,并且不应保留其副本。 如果您稍后需要某个项目的位置(例如,在点击监听器中),请使用getAdapterPosition() ,它将具有更新的适配器位置。 如果适配器可以处理有效的部分绑定,则替代onBindViewHolder(ViewHolder, int, List)

Parameters
holder VH: 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.

onBindViewHolder

void onBindViewHolder (VH holder, 
                int position, 
                List<Object> payloads)

由RecyclerView调用以在指定位置显示数据。 此方法应更新itemView的内容以反映给定位置处的项目。

请注意,与ListView不同,如果项目的位置在数据集中发生更改,RecyclerView将不会再次调用此方法,除非项目本身无效或无法确定新位置。 出于这个原因,您应该只使用position参数,同时在此方法中获取相关数据项,并且不应保留其副本。 如果您稍后需要某个项目的位置(例如,在点击监听器中),请使用getAdapterPosition() ,它将具有更新的适配器位置。

部分绑定vs完全绑定:

有效载荷参数是来自notifyItemChanged(int, Object)notifyItemRangeChanged(int, int, Object)的合并列表。 如果有效载荷列表不是空的,则ViewHolder当前绑定到旧数据,并且适配器可以使用有效载荷信息运行有效的部分更新。 如果有效负载为空,则适配器必须运行完整绑定。 适配器不应该认为onBindViewHolder()会接收通过notify方法传递的有效内容。 例如,当视图未附加到屏幕上时,notifyItemChange()中的有效内容将被简单地删除。

Parameters
holder VH: 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.
payloads List: A non-null list of merged payloads. Can be empty list if requires full update.

onCreateViewHolder

VH onCreateViewHolder (ViewGroup parent, 
                int viewType)

当RecyclerView需要给定类型的新 RecyclerView.ViewHolder来表示项目时调用。

这个新的ViewHolder应该用一个新的View来构建,它可以表示给定类型的项目。 您可以手动创建新的视图,也可以从XML布局文件中对其进行充气。

新的ViewHolder将用于显示使用onBindViewHolder(ViewHolder, int, List)的适配器的项目。 由于它将被重新用于显示数据集中的不同项目,因此缓存对View的子视图的引用以避免不必要的findViewById(int)调用是一个好主意。

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
VH A new ViewHolder that holds a View of the given view type.

也可以看看:

onDetachedFromRecyclerView

void onDetachedFromRecyclerView (RecyclerView recyclerView)

当它停止观察此适配器时,由RecyclerView调用。

Parameters
recyclerView RecyclerView: The RecyclerView instance which stopped observing this adapter.

也可以看看:

onFailedToRecycleView

boolean onFailedToRecycleView (VH holder)

如果由此适配器创建的ViewHolder由于其瞬态状态而无法回收,则由RecyclerView调用。 收到此回调后,适配器可以清除影响视图瞬态状态的动画并返回true以便视图可以回收。 请记住,相关视图已从RecyclerView中删除。

在某些情况下,虽然它具有瞬态,但回收视图是可以接受的。 大多数情况下,当View被重新启动到新的位置时,这种情况下, onBindViewHolder(ViewHolder, int)呼叫中的瞬态将被清除。 出于这个原因,RecyclerView将决定留给适配器,并使用此方法的返回值来决定是否回收视图。

请注意,当所有动画由RecyclerView.ItemAnimator创建时,您都不应该收到此回调,因为RecyclerView将这些视图保留为小孩,直到其动画完成。 当项目视图的子项创建使用RecyclerView.ItemAnimator可能不容易实现的动画时,此回调很有用。

永远不应该通过调用解决此问题holder.itemView.setHasTransientState(false); ,除非你以前称为holder.itemView.setHasTransientState(true); 每个View.setHasTransientState(true)调用必须由匹配View.setHasTransientState(false)呼叫,否则,视图的状态可能变得不一致。 您应该始终喜欢结束或取消触发瞬态状态的动画,而不是手动处理它。

Parameters
holder VH: 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

void onViewAttachedToWindow (VH holder)

当此适配器创建的视图已附加到窗口时调用。

这可以用作视图即将被用户看到的合理信号。 如果适配器先前释放了onViewDetachedFromWindow任何资源,则应在此恢复这些资源。

Parameters
holder VH: Holder of the view being attached

onViewDetachedFromWindow

void onViewDetachedFromWindow (VH holder)

当此适配器创建的视图已从其窗口分离时调用。

脱离窗口不一定是永久的条件; 适配器视图的使用者可能会选择在屏幕不可见时缓存视图,并根据需要附加分离视图。

Parameters
holder VH: Holder of the view being detached

onViewRecycled

void onViewRecycled (VH holder)

当此适配器创建的视图已被回收时调用。

RecyclerView.LayoutManager决定不再需要将其附加到其父项RecyclerView时,视图将被回收。 这可能是因为它已经不在可见范围内,或者是由仍然附加到父RecyclerView的视图表示的一组缓存视图。 如果项目视图绑定了大量或昂贵的数据(如大型位图),则可能是释放这些资源的好地方。

RecyclerView在清除ViewHolder的内部数据并将其发送到RecycledViewPool之前调用此方法。 这样,如果ViewHolder在回收之前保留有效信息,则可以致电getAdapterPosition()以获取其适配器位置。

Parameters
holder VH: The ViewHolder for the view being recycled

registerAdapterDataObserver

void registerAdapterDataObserver (RecyclerView.AdapterDataObserver observer)

注册一个新的观察者来监听数据更改。

适配器可以发布描述特定更改的各种事件。 并非所有适配器都支持所有更改类型,如果更多特定数据不可用,某些可能会回退到通用"something changed"事件。

完成后,使用适配器向观察员注册的组件 unregistering这些观察员负责。

Parameters
observer RecyclerView.AdapterDataObserver: Observer to register

也可以看看:

setHasStableIds

void setHasStableIds (boolean hasStableIds)

指示数据集中的每个项目是否可以用类型 Long的唯一标识符表示。

Parameters
hasStableIds boolean: Whether items in data set have unique identifiers or not.

也可以看看:

unregisterAdapterDataObserver

void unregisterAdapterDataObserver (RecyclerView.AdapterDataObserver observer)

取消注册当前正在侦听数据更改的观察者。

未注册的观察者将不再接收有关适配器更改的事件。

Parameters
observer RecyclerView.AdapterDataObserver: Observer to unregister

也可以看看:

Hooray!