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
。
Public constructors |
|
---|---|
RecyclerView.Adapter() |
Public methods |
|
---|---|
final void |
bindViewHolder(VH holder, int position) 此方法内部调用 |
final VH |
createViewHolder(ViewGroup parent, int viewType) 此方法调用 |
abstract int |
getItemCount() 返回适配器持有的数据集中的项目总数。 |
long |
getItemId(int position) 以 |
int |
getItemViewType(int position) 为了查看回收目的,返回物品的视图类型 |
final boolean |
hasObservers() 如果一个或多个观察者连接到此适配器,则返回true。 |
final boolean |
hasStableIds() 如果此适配器发布唯一 |
final void |
notifyDataSetChanged() 通知任何注册的观察员数据集已更改。 |
final void |
notifyItemChanged(int position, Object payload) 通知任何注册的观察者, |
final void |
notifyItemChanged(int position) 通知任何注册的观察员, |
final void |
notifyItemInserted(int position) 通知任何注册的观察员,该项目反映在 |
final void |
notifyItemMoved(int fromPosition, int toPosition) 通知任何注册的观察员,该项目反映在 |
final void |
notifyItemRangeChanged(int positionStart, int itemCount, Object payload) 通知所有注册的观察者,该 |
final void |
notifyItemRangeChanged(int positionStart, int itemCount) 通知任何注册的观察员,从位置 |
final void |
notifyItemRangeInserted(int positionStart, int itemCount) 通知所有注册了的观察是,目前反映 |
final void |
notifyItemRangeRemoved(int positionStart, int itemCount) 通知任何注册的观察员,以前位于 |
final void |
notifyItemRemoved(int 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需要一个新的给定类型的 |
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) 指示数据集中的每个项目是否可以用类型 |
void |
unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) 取消注册当前正在侦听数据更改的观察者。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
RecyclerView.Adapter ()
void bindViewHolder (VH holder, int position)
此方法内部调用 onBindViewHolder(ViewHolder, int)
以更新 RecyclerView.ViewHolder
内容与给定位置的项目,并设置一些专用字段供RecyclerView使用。
Parameters | |
---|---|
holder |
VH
|
position |
int
|
VH createViewHolder (ViewGroup parent, int viewType)
此方法调用 onCreateViewHolder(ViewGroup, int)
以创建新的 RecyclerView.ViewHolder
并初始化RecyclerView要使用的一些专用字段。
Parameters | |
---|---|
parent |
ViewGroup
|
viewType |
int
|
Returns | |
---|---|
VH |
int getItemCount ()
返回适配器持有的数据集中的项目总数。
Returns | |
---|---|
int |
The total number of items in this adapter. |
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 |
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. |
boolean hasObservers ()
如果一个或多个观察者连接到此适配器,则返回true。
Returns | |
---|---|
boolean |
true if this adapter has observers |
boolean hasStableIds ()
如果此适配器发布唯一的long
值,则该值可以充当数据集中给定位置处的项目的键,则返回true。 如果该项目重新放置在数据集中,则为该项目返回的ID应该相同。
Returns | |
---|---|
boolean |
true if this adapter's items have stable IDs |
void notifyDataSetChanged ()
通知任何注册的观察员数据集已更改。
有两类不同的数据更改事件,项目更改和结构更改。 项目更改是指单个项目更新其数据但未发生位置更改时。 结构更改是指在数据集中插入,移除或移动项目时。
此事件没有指定数据集已更改的内容,强制任何观察者都假定所有现有项目和结构可能不再有效。 LayoutManagers将被迫完全重新绑定并重新布局所有可见的视图。
RecyclerView
将尝试为适配器合成可见的结构更改事件,该适配器在使用此方法时报告它们具有stable IDs
。 这可以帮助实现动画和视觉对象持久化的目的,但单个项目视图仍然需要反弹并重新布局。
如果您正在编写适配器,那么如果可以的话,使用更具体的更改事件总是更加高效。 依靠notifyDataSetChanged()
作为最后的手段。
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 |
void notifyItemChanged (int position)
通知任何注册的观察员, position
项目已更改。 相当于致电notifyItemChanged(position, null);
。
这是项目更改事件,而不是结构更改事件。 它表明任何对position
数据的position
都是过时的,应该更新。 position
的项目保留相同的身份。
Parameters | |
---|---|
position |
int : Position of the item that has changed |
void notifyItemInserted (int position)
通知任何注册的观察员,该项目反映在position
已被新插入。 此前在position
的项目现在位于position + 1
。
这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。
Parameters | |
---|---|
position |
int : Position of the newly inserted item in the data set |
void notifyItemMoved (int fromPosition, int toPosition)
通知任何注册的观察员,该项目反映在 fromPosition
已被移至 toPosition
。
这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。
Parameters | |
---|---|
fromPosition |
int : Previous position of the item. |
toPosition |
int : New position of the item. |
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 |
也可以看看:
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 |
也可以看看:
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 |
也可以看看:
void notifyItemRangeRemoved (int positionStart, int itemCount)
通知任何注册的观察员,以前位于positionStart
的itemCount
项目已从数据集中删除。 以前位于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 |
void notifyItemRemoved (int position)
通知任何注册的观察员,以前位于position
的项目已从数据集中删除。 之前位于position
之后的position
现在可以在oldPosition - 1
找到。
这是一个结构性变化事件。 数据集中其他现有项目的陈述仍然被认为是最新的,并且不会被反弹,尽管其位置可能会改变。
Parameters | |
---|---|
position |
int : Position of the item that has now been removed |
void onAttachedToRecyclerView (RecyclerView recyclerView)
当它开始观察此适配器时,由RecyclerView调用。
请记住,多个RecyclerViews可能会观察到相同的适配器。
Parameters | |
---|---|
recyclerView |
RecyclerView : The RecyclerView instance which started observing this adapter. |
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. |
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. |
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. |
void onDetachedFromRecyclerView (RecyclerView recyclerView)
当它停止观察此适配器时,由RecyclerView调用。
Parameters | |
---|---|
recyclerView |
RecyclerView : The RecyclerView instance which stopped observing this adapter. |
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. |
void onViewAttachedToWindow (VH holder)
当此适配器创建的视图已附加到窗口时调用。
这可以用作视图即将被用户看到的合理信号。 如果适配器先前释放了onViewDetachedFromWindow
任何资源,则应在此恢复这些资源。
Parameters | |
---|---|
holder |
VH : Holder of the view being attached |
void onViewDetachedFromWindow (VH holder)
当此适配器创建的视图已从其窗口分离时调用。
脱离窗口不一定是永久的条件; 适配器视图的使用者可能会选择在屏幕不可见时缓存视图,并根据需要附加分离视图。
Parameters | |
---|---|
holder |
VH : Holder of the view being detached |
void onViewRecycled (VH holder)
当此适配器创建的视图已被回收时调用。
当RecyclerView.LayoutManager
决定不再需要将其附加到其父项RecyclerView
时,视图将被回收。 这可能是因为它已经不在可见范围内,或者是由仍然附加到父RecyclerView的视图表示的一组缓存视图。 如果项目视图绑定了大量或昂贵的数据(如大型位图),则可能是释放这些资源的好地方。
RecyclerView在清除ViewHolder的内部数据并将其发送到RecycledViewPool之前调用此方法。 这样,如果ViewHolder在回收之前保留有效信息,则可以致电getAdapterPosition()
以获取其适配器位置。
Parameters | |
---|---|
holder |
VH : The ViewHolder for the view being recycled |
void registerAdapterDataObserver (RecyclerView.AdapterDataObserver observer)
注册一个新的观察者来监听数据更改。
适配器可以发布描述特定更改的各种事件。 并非所有适配器都支持所有更改类型,如果更多特定数据不可用,某些可能会回退到通用"something changed"
事件。
完成后,使用适配器向观察员注册的组件 unregistering
这些观察员负责。
Parameters | |
---|---|
observer |
RecyclerView.AdapterDataObserver : Observer to register |
void setHasStableIds (boolean hasStableIds)
指示数据集中的每个项目是否可以用类型 Long
的唯一标识符表示。
Parameters | |
---|---|
hasStableIds |
boolean : Whether items in data set have unique identifiers or not. |
也可以看看:
void unregisterAdapterDataObserver (RecyclerView.AdapterDataObserver observer)
取消注册当前正在侦听数据更改的观察者。
未注册的观察者将不再接收有关适配器更改的事件。
Parameters | |
---|---|
observer |
RecyclerView.AdapterDataObserver : Observer to unregister |