Most visited

Recently visited

RecyclerView

public class RecyclerView
extends ViewGroup implements ScrollingView, NestedScrollingChild

java.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.support.v7.widget.RecyclerView
Known Direct Subclasses


为大型数据集提供有限窗口的灵活视图。

Glossary of terms:

Positions in RecyclerView:

RecyclerView在RecyclerView.AdapterRecyclerView.LayoutManager之间引入了一个额外的抽象级别,以便能够在布局计算过程中检测批次中的数据集更改。 这可以让LayoutManager跟踪适配器更改以计算动画。 它还有助于提高性能,因为所有视图绑定同时发生,并且避免了不必要的绑定。

为此,RecyclerView中有两种类型的 position相关方法:

除了调度 adapter.notify*事件和计算更新的布局之间的时间之外,这两个位置是相同的。

方法,返回或接收*LayoutPosition*的最新布局计算(例如使用位置getLayoutPosition()findViewHolderForLayoutPosition(int) )。 这些职位包括所有更改,直到最后的布局计算。 您可以依靠这些职位与当前在屏幕上看到的用户保持一致。 例如,如果屏幕上有一个项目列表,并且用户要求第5 元素,则应该使用这些方法,因为它们将与用户看到的内容匹配。

另一组位置相关方法的形式为*AdapterPosition* (如getAdapterPosition()findViewHolderForAdapterPosition(int) ),当你需要跟上时代的适配器的位置,即使他们可能没有被反映到尚未布局的工作,你应该使用这些方法。 例如,如果要在ViewHolder单击中访问适配器中的项目,则应使用getAdapterPosition() 请注意,如果已调用notifyDataSetChanged()并且尚未计算新布局,则这些方法可能无法计算适配器位置。 出于这个原因,您应该仔细处理来自这些方法的NO_POSITIONnull结果。

编写 RecyclerView.LayoutManager您几乎总是要使用布局位置,而编写 RecyclerView.Adapter ,您可能需要使用适配器位置。

Summary

Nested classes

class RecyclerView.Adapter<VH extends RecyclerView.ViewHolder>

适配器的基类

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

class RecyclerView.AdapterDataObserver

观察者基类用于观察对RecyclerView.Adapter更改。

interface RecyclerView.ChildDrawingOrderCallback

一个回调界面,可用于更改RecyclerView子项的绘制顺序。

class RecyclerView.ItemAnimator

该类定义了在对适配器进行更改时发生在项目上的动画。

class RecyclerView.ItemDecoration

ItemDecoration允许应用程序从适配器的数据集中为特定的项目视图添加特殊的图形和布局偏移量。

class RecyclerView.LayoutManager

LayoutManager负责测量和定位RecyclerView项目视图,并确定何时回收用户不再可见的项目视图的策略。

class RecyclerView.LayoutParams

LayoutParams子类别为RecyclerView

interface RecyclerView.OnChildAttachStateChangeListener

一个Listener接口,可以连接到RecylcerView以在ViewHolder连接到RecyclerView或从RecyclerView分离时得到通知。

interface RecyclerView.OnItemTouchListener

OnItemTouchListener允许应用程序在RecyclerView自身的滚动行为被视为这些触摸事件之前,在RecyclerView的视图层次结构级别拦截正在进行的触摸事件。

class RecyclerView.OnScrollListener

当RecyclerView上发生滚动事件时,可以将OnScrollListener添加到RecyclerView中以接收消息。

class RecyclerView.RecycledViewPool

RecycledViewPool可让您在多个RecyclerView之间共享视图。

class RecyclerView.Recycler

回收站负责管理报废或分离的物料视图以供重复使用。

interface RecyclerView.RecyclerListener

RecyclerListener可以设置在RecyclerView上,以便在视图回收时接收消息。

class RecyclerView.SimpleOnItemTouchListener

RecyclerView.OnItemTouchListener的实现具有空方法体和默认返回值。

class RecyclerView.SmoothScroller

用于平滑滚动的基类。

class RecyclerView.State

包含有关当前RecyclerView状态的有用信息,例如目标滚动位置或视图焦点。

class RecyclerView.ViewCacheExtension

ViewCacheExtension是一个辅助类,用于提供可由开发人员控制的额外视图缓存层。

class RecyclerView.ViewHolder

ViewHolder描述了一个项目视图和关于它在RecyclerView中的位置的元数据。

XML attributes

android.support.v7.recyclerview:layoutManager Class name of the Layout Manager to be used. 

Inherited XML attributes

From class android.view.ViewGroup
From class android.view.View

Constants

int HORIZONTAL

int INVALID_TYPE

long NO_ID

int NO_POSITION

int SCROLL_STATE_DRAGGING

RecyclerView目前正在被外部输入如用户触摸输入拖动。

int SCROLL_STATE_IDLE

RecyclerView目前不在滚动。

int SCROLL_STATE_SETTLING

RecyclerView目前正在动画到最终位置,而不受外界控制。

int TOUCH_SLOP_DEFAULT

常量用于 setScrollingTouchSlop(int)

int TOUCH_SLOP_PAGING

常量用于 setScrollingTouchSlop(int)

int VERTICAL

Inherited constants

From class android.view.ViewGroup
From class android.view.View

Inherited fields

From class android.view.View

Public constructors

RecyclerView(Context context)
RecyclerView(Context context, AttributeSet attrs)
RecyclerView(Context context, AttributeSet attrs, int defStyle)

Public methods

void addFocusables(ArrayList<View> views, int direction, int focusableMode)

将视图后代的任何可聚焦视图添加到视图中(可能包括该视图,如果它本身是可聚焦的话)。

void addItemDecoration(RecyclerView.ItemDecoration decor)

添加一个 RecyclerView.ItemDecoration到这个RecyclerView。

void addItemDecoration(RecyclerView.ItemDecoration decor, int index)

添加一个 RecyclerView.ItemDecoration到这个RecyclerView。

void addOnChildAttachStateChangeListener(RecyclerView.OnChildAttachStateChangeListener listener)

注册一个监听器,当子视图连接到RecyclerView或从RecyclerView分离时,将会收到通知。

void addOnItemTouchListener(RecyclerView.OnItemTouchListener listener)

添加 RecyclerView.OnItemTouchListener以在将触发事件分派到子视图或此视图的标准滚动行为之前拦截触摸事件。

void addOnScrollListener(RecyclerView.OnScrollListener listener)

添加一个侦听器,将会通知任何滚动状态或位置的变化。

void clearOnChildAttachStateChangeListeners()

删除通过 addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener)添加的所有侦听 addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener)

void clearOnScrollListeners()

移除已通知滚动状态或位置发生任何更改的所有辅助侦听器。

int computeHorizontalScrollExtent()

计算水平滚动条拇指在水平范围内的水平范围。

int computeHorizontalScrollOffset()

计算水平滚动条拇指在水平范围内的水平偏移量。

int computeHorizontalScrollRange()

计算水平滚动条代表的水平范围。

int computeVerticalScrollExtent()

计算垂直滚动条拇指在垂直范围内的垂直范围。

int computeVerticalScrollOffset()

计算垂直滚动条拇指在垂直范围内的垂直偏移量。

int computeVerticalScrollRange()

计算垂直滚动条代表的垂直范围。

boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed)

向嵌套滚动父级派发一个投掷。

boolean dispatchNestedPreFling(float velocityX, float velocityY)

在此视图处理它之前,将嵌套分派给嵌套的滚动父级。

boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow)

在该视图消耗其任何部分之前,调度正在进行的嵌套滚动的一个步骤。

boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow)

发送正在进行的嵌套滚动的一个步骤。

void draw(Canvas c)

手动将此视图(及其所有子项)呈现给定的Canvas。

boolean drawChild(Canvas canvas, View child, long drawingTime)

绘制这个视图组的一个孩子。

View findChildViewUnder(float x, float y)

找到给定点下的最顶层视图。

View findContainingItemView(View view)

遍历给定视图的祖先,并返回包含它的项目视图,也是RecyclerView的直接子视图。

RecyclerView.ViewHolder findContainingViewHolder(View view)

返回包含给定视图的ViewHolder。

RecyclerView.ViewHolder findViewHolderForAdapterPosition(int position)

返回数据集给定位置的项目的ViewHolder。

RecyclerView.ViewHolder findViewHolderForItemId(long id)

返回具有给定ID的项目的ViewHolder。

RecyclerView.ViewHolder findViewHolderForLayoutPosition(int position)

返回数据集中给定位置的项目的ViewHolder,从最新的布局阶段开始。

RecyclerView.ViewHolder findViewHolderForPosition(int position)

此方法已弃用。 使用findViewHolderForLayoutPosition(int)findViewHolderForAdapterPosition(int)

boolean fling(int velocityX, int velocityY)

以每秒像素为单位,以每个轴的初始速度开始标准投掷。

View focusSearch(View focused, int direction)

由于RecyclerView是一个包含虚拟子项(包含在适配器中但在用户界面中不可见的项目)的ViewGroup集合,因此它采用了与其他ViewGroup不同的更加涉及的焦点搜索策略。

ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs)

根据提供的属性集返回一组新的布局参数。

Adapter getAdapter()

检索先前设置的适配器;如果未设置适配器,则返回null。

int getBaseline()

将RecyclerView文本基线的偏移量从其顶部边界返回。

int getChildAdapterPosition(View child)

返回给定子视图对应的适配器位置。

long getChildItemId(View child)

返回给定子视图对应的稳定项目标识。

int getChildLayoutPosition(View child)

返回给定子视图的适配器位置以及最近完成的布局传递。

int getChildPosition(View child)

此方法已弃用。 请使用getChildAdapterPosition(View)getChildLayoutPosition(View)

RecyclerView.ViewHolder getChildViewHolder(View child)

检索给 RecyclerView.ViewHolder视图的 RecyclerView.ViewHolder

RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate()

返回RecyclerView使用的可访问性委托兼容性实现。

RecyclerView.ItemAnimator getItemAnimator()

获取此RecyclerView的当前ItemAnimator。

RecyclerView.LayoutManager getLayoutManager()

返回目前负责此RecyclerView布局策略的 RecyclerView.LayoutManager

int getMaxFlingVelocity()

返回此RecyclerView使用的最大投掷速度。

int getMinFlingVelocity()

返回启动投掷的最低速度。

boolean getPreserveFocusAfterLayout()

如果RecyclerView应该尝试保留当前聚焦的Adapter Item的焦点,即使在布局计算期间替换表示Item的View也会返回true。

RecyclerView.RecycledViewPool getRecycledViewPool()

检索这个RecyclerView的 RecyclerView.RecycledViewPool

int getScrollState()

返回RecyclerView的当前滚动状态。

boolean hasFixedSize()
boolean hasNestedScrollingParent()

如果此视图具有嵌套滚动父级,则返回true。

boolean hasPendingAdapterUpdates()

返回是否有尚未应用于布局的待定适配器更新。

void invalidateItemDecorations()

使所有ItemDecorations无效。

boolean isAnimating()

如果RecyclerView当前正在运行一些动画,则返回true。

boolean isAttachedToWindow()

如果RecyclerView附加到窗口,则返回true。

boolean isComputingLayout()

返回RecyclerView是否正在计算布局。

boolean isLayoutFrozen()

如果布局和滚动被冻结,则返回true。

boolean isNestedScrollingEnabled()

如果对此视图启用嵌套滚动,则返回true。

void offsetChildrenHorizontal(int dx)

将所有子视图的边界偏移 dx像素。

void offsetChildrenVertical(int dy)

将所有子视图的边界偏移 dy像素。

void onChildAttachedToWindow(View child)

在项目视图附加到此RecyclerView时调用。

void onChildDetachedFromWindow(View child)

在从此RecyclerView分离项目视图时调用。

void onDraw(Canvas c)

实施这个来做你的绘画。

boolean onGenericMotionEvent(MotionEvent event)

实现此方法来处理通用运动事件。

boolean onInterceptTouchEvent(MotionEvent e)

实施此方法来拦截所有触摸屏幕动作事件。

void onScrollStateChanged(int state)

当此RecyclerView的滚动状态改变时调用。

void onScrolled(int dx, int dy)

当此RecyclerView的滚动位置改变时调用。

boolean onTouchEvent(MotionEvent e)

实现此方法来处理触摸屏幕动作事件。

void removeItemDecoration(RecyclerView.ItemDecoration decor)

从此RecyclerView中删除 RecyclerView.ItemDecoration

void removeOnChildAttachStateChangeListener(RecyclerView.OnChildAttachStateChangeListener listener)

从附加子状态侦听器列表中删除提供的侦听器。

void removeOnItemTouchListener(RecyclerView.OnItemTouchListener listener)

删除 RecyclerView.OnItemTouchListener

void removeOnScrollListener(RecyclerView.OnScrollListener listener)

移除已通知滚动状态或位置发生任何更改的侦听器。

void requestChildFocus(View child, View focused)

当这个父母的孩子需要关注时调用

boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate)

当该组的小孩想要将特定矩形定位到屏幕上时调用。

void requestDisallowInterceptTouchEvent(boolean disallowIntercept)

当孩子不希望这个父母及其祖先用 onInterceptTouchEvent(MotionEvent)拦截触摸事件时 onInterceptTouchEvent(MotionEvent)

void requestLayout()

当事情发生变化时调用它,这已经使这个视图的布局无效。

void scrollBy(int x, int y)

移动视图的滚动位置。

void scrollTo(int x, int y)

设置视图的滚动位置。

void scrollToPosition(int position)

便捷方法滚动到某个位置。

void sendAccessibilityEventUnchecked(AccessibilityEvent event)

此方法的行为与 sendAccessibilityEvent(int)完全相同,但其参数为空 AccessibilityEvent ,并且不执行检查是否启用辅助功能。

void setAccessibilityDelegateCompat(RecyclerViewAccessibilityDelegate accessibilityDelegate)

设置RecyclerView使用的可访问性委托兼容性实现。

void setAdapter(Adapter adapter)

设置新的适配器以按需提供子视图。

void setChildDrawingOrderCallback(RecyclerView.ChildDrawingOrderCallback childDrawingOrderCallback)

设置用于绘制儿童的 RecyclerView.ChildDrawingOrderCallback

void setClipToPadding(boolean clipToPadding)

设置此ViewGroup是否将其子对象填充到其填充中,并将存在填充的任何EdgeEffect调整大小(但不剪切)到填充区域。

void setHasFixedSize(boolean hasFixedSize)

如果RecyclerView可以预先知道RecyclerView的大小不受适配器内容的影响,它可以执行多次优化。

void setItemAnimator(RecyclerView.ItemAnimator animator)

设置将处理动画的 RecyclerView.ItemAnimator ,这些动画涉及对此RecyclerView中项目的更改。

void setItemViewCacheSize(int size)

在将它们添加到可能共享的 recycled view pool之前,设置要保留的屏幕外视图的数量。

void setLayoutFrozen(boolean frozen)

启用或禁用布局和滚动。

void setLayoutManager(RecyclerView.LayoutManager layout)

设置该RecyclerView将使用的 RecyclerView.LayoutManager

void setNestedScrollingEnabled(boolean enabled)

启用或禁用此视图的嵌套滚动。

void setOnScrollListener(RecyclerView.OnScrollListener listener)

此方法已弃用。 使用addOnScrollListener(OnScrollListener)removeOnScrollListener(OnScrollListener)

void setPreserveFocusAfterLayout(boolean preserveFocusAfterLayout)

设置RecyclerView是否应该尝试在布局计算之后保留相同的项目。

void setRecycledViewPool(RecyclerView.RecycledViewPool pool)

回收视图池允许多个RecyclerView共享一个公共的废料视图池。

void setRecyclerListener(RecyclerView.RecyclerListener listener)

注册一个侦听器,每当子视图被回收时都会被通知。

void setScrollingTouchSlop(int slopConstant)

为特定用例配置滚动触摸边框。

void setViewCacheExtension(RecyclerView.ViewCacheExtension extension)

设置一个新的 RecyclerView.ViewCacheExtension由Recycler使用。

void smoothScrollBy(int dx, int dy)

沿任一轴按给定数量的像素动画滚动。

void smoothScrollToPosition(int position)

开始平滑滚动到适配器位置。

boolean startNestedScroll(int axes)

沿给定轴开始可嵌套滚动操作。

void stopNestedScroll()

停止正在进行的嵌套滚动。

void stopScroll()

停止正在进行的任何当前滚动,例如由 smoothScrollBy(int, int)开始的 fling(int, int)或由触摸发起的 fling(int, int)

void swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews)

用提供的交换机替换当前的适配器。

Protected methods

boolean checkLayoutParams(ViewGroup.LayoutParams p)
void dispatchRestoreInstanceState(SparseArray<Parcelable> container)

覆盖以防止适配器创建的任何视图解冻。

void dispatchSaveInstanceState(SparseArray<Parcelable> container)

覆盖以防止冻结由适配器创建的任何视图。

ViewGroup.LayoutParams generateDefaultLayoutParams()

返回一组默认布局参数。

ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p)

根据提供的布局参数返回一组安全的布局参数。

int getChildDrawingOrder(int childCount, int i)

返回为此迭代绘制的子的索引。

void onAttachedToWindow()

这在视图附加到窗口时被调用。

void onDetachedFromWindow()

这是在视图从窗口分离时调用的。

void onLayout(boolean changed, int l, int t, int r, int b)

当这个视图为每个孩子分配一个大小和位置时,从布局调用。

void onMeasure(int widthSpec, int heightSpec)

测量视图及其内容以确定测量宽度和测量高度。

boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect)

找一个后裔打电话给 requestFocus()

void onRestoreInstanceState(Parcelable state)

吊钩允许视图重新应用先前由 onSaveInstanceState()生成的内部状态的表示。

Parcelable onSaveInstanceState()

钩子允许视图生成其内部状态的表示,稍后可用于创建具有相同状态的新实例。

void onSizeChanged(int w, int h, int oldw, int oldh)

当这个视图的大小发生变化时,这在布局期间被调用。

void removeDetachedView(View child, boolean animate)

完成删除分离的视图。

Inherited methods

From class android.view.ViewGroup
From class android.view.View
From class java.lang.Object
From interface android.view.ViewParent
From interface android.view.ViewManager
From interface android.graphics.drawable.Drawable.Callback
From interface android.view.KeyEvent.Callback
From interface android.view.accessibility.AccessibilityEventSource
From interface android.support.v4.view.ScrollingView
From interface android.support.v4.view.NestedScrollingChild

XML attributes

android.support.v7.recyclerview:layoutManager

要使用的布局管理器的类名称。

The class must extend android.support.v7.widget.RecyclerView$LayoutManager and have either a default constructor or constructor with the signature (android.content.Context, android.util.AttributeSet, int, int).

If the name starts with a '.', application package is prefixed. Else, if the name contains a '.', the classname is assumed to be a full class name. Else, the recycler view package name (android.support.v7.widget) is prefixed.

可能是一个字符串值,使用'\\;' 转义字符如'\\ n'或'\\ uxxxx'作为unicode字符;

Constants

HORIZONTAL

int HORIZONTAL

常量值:0(0x00000000)

INVALID_TYPE

int INVALID_TYPE

常量值:-1(0xffffffff)

NO_ID

long NO_ID

常量值:-1(0xffffffffffffffff)

NO_POSITION

int NO_POSITION

常量值:-1(0xffffffff)

SCROLL_STATE_DRAGGING

int SCROLL_STATE_DRAGGING

RecyclerView目前正在被外部输入如用户触摸输入拖动。

也可以看看:

常数值:1(0x00000001)

SCROLL_STATE_IDLE

int SCROLL_STATE_IDLE

RecyclerView目前不在滚动。

也可以看看:

常量值:0(0x00000000)

SCROLL_STATE_SETTLING

int SCROLL_STATE_SETTLING

RecyclerView目前正在动画到最终位置,而不受外界控制。

也可以看看:

常量值:2(0x00000002)

TOUCH_SLOP_DEFAULT

int TOUCH_SLOP_DEFAULT

常量用于setScrollingTouchSlop(int) 表示RecyclerView应该使用标准的触控斜面进行平滑,连续的滚动。

常量值:0(0x00000000)

TOUCH_SLOP_PAGING

int TOUCH_SLOP_PAGING

常量用于setScrollingTouchSlop(int) 指示RecyclerView应该使用标准的触摸边框来滚动捕捉页面或其他粗糙屏障的小部件。

常数值:1(0x00000001)

VERTICAL

int VERTICAL

常数值:1(0x00000001)

Public constructors

RecyclerView

RecyclerView (Context context)

Parameters
context Context

RecyclerView

RecyclerView (Context context, 
                AttributeSet attrs)

Parameters
context Context
attrs AttributeSet

RecyclerView

RecyclerView (Context context, 
                AttributeSet attrs, 
                int defStyle)

Parameters
context Context
attrs AttributeSet
defStyle int

Public methods

addFocusables

void addFocusables (ArrayList<View> views, 
                int direction, 
                int focusableMode)

将视图后代的任何可聚焦视图添加到视图中(可能包括该视图,如果它本身是可聚焦的话)。 如果我们处于触摸模式,则该方法会添加所有可聚焦视图,或者只有在触摸模式下可以聚焦的视图才可以聚焦;如果根据可聚焦模式参数启用了辅助功能,则只有可以使用辅助焦点的视图。

Parameters
views ArrayList: Focusable views found so far or null if all we are interested is the number of focusables.
direction int: The direction of the focus.
focusableMode int: The type of focusables to be added.

addItemDecoration

void addItemDecoration (RecyclerView.ItemDecoration decor)

添加一个RecyclerView.ItemDecoration到这个RecyclerView。 商品装饰可以影响个别商品视图的测量和绘图。

物品装饰品已订购。 先放置在列表中的装饰将首先运行/查询/绘制,以便对项目视图产生影响。 填充添加到视图将嵌套; 先前装饰添加的填充将意味着列表中的更多项目装饰将被要求在先前装饰的给定区域内绘制/填充。

Parameters
decor RecyclerView.ItemDecoration: Decoration to add

addItemDecoration

void addItemDecoration (RecyclerView.ItemDecoration decor, 
                int index)

添加一个RecyclerView.ItemDecoration到这个RecyclerView。 商品装饰可以影响个别商品视图的测量和绘图。

物品装饰品已订购。 先放置在列表中的装饰将首先运行/查询/绘制,以便对项目视图产生影响。 填充添加到视图将嵌套; 先前装饰添加的填充将意味着列表中的更多项目装饰将被要求在先前装饰的给定区域内绘制/填充。

Parameters
decor RecyclerView.ItemDecoration: Decoration to add
index int: Position in the decoration chain to insert this decoration at. If this value is negative the decoration will be added at the end.

addOnChildAttachStateChangeListener

void addOnChildAttachStateChangeListener (RecyclerView.OnChildAttachStateChangeListener listener)

注册一个监听器,当子视图连接到RecyclerView或从RecyclerView分离时,将会收到通知。

当LayoutManager或RecyclerView决定不再需要子视图时,将调用此侦听器。 如果应用程序将昂贵或重量级数据与项目视图相关联,则这可能是发布或释放这些资源的好地方。

Parameters
listener RecyclerView.OnChildAttachStateChangeListener: Listener to register

addOnItemTouchListener

void addOnItemTouchListener (RecyclerView.OnItemTouchListener listener)

添加 RecyclerView.OnItemTouchListener以在将触发事件分派到子视图或此视图的标准滚动行为之前拦截它们。

客户端代码可以使用监听器来实现项目操作行为。 一旦侦听器从onInterceptTouchEvent(RecyclerView, MotionEvent)返回true, onInterceptTouchEvent(RecyclerView, MotionEvent)为每个传入的onInterceptTouchEvent(RecyclerView, MotionEvent)其方法onTouchEvent(RecyclerView, MotionEvent) ,直到手势结束。

Parameters
listener RecyclerView.OnItemTouchListener: Listener to add

也可以看看:

addOnScrollListener

void addOnScrollListener (RecyclerView.OnScrollListener listener)

添加一个侦听器,将会通知任何滚动状态或位置的变化。

添加侦听器的组件在完成时应小心删除它。 拥有视图所有权的其他组件可能会调用clearOnScrollListeners()来删除所有附加的监听器。

Parameters
listener RecyclerView.OnScrollListener: listener to set or null to clear

clearOnChildAttachStateChangeListeners

void clearOnChildAttachStateChangeListeners ()

删除通过 addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener)添加的所有侦听 addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener)

clearOnScrollListeners

void clearOnScrollListeners ()

移除已通知滚动状态或位置发生任何更改的所有辅助侦听器。

computeHorizontalScrollExtent

int computeHorizontalScrollExtent ()

计算水平滚动条拇指在水平范围内的水平范围。 该值用于计算滚动条轨道内的拇指长度。

范围以任意单位表示,必须与 computeHorizontalScrollRange()computeHorizontalScrollOffset()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeHorizontalScrollExtent(RecyclerView.State)在LayoutManager中覆盖 computeHorizontalScrollExtent(RecyclerView.State)

Returns
int The horizontal extent of the scrollbar's thumb

也可以看看:

computeHorizontalScrollOffset

int computeHorizontalScrollOffset ()

计算水平滚动条拇指在水平范围内的水平偏移量。 该值用于计算滚动条轨道内的拇指长度。

范围以任意单位表示,必须与 computeHorizontalScrollRange()computeHorizontalScrollExtent()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeHorizontalScrollOffset(RecyclerView.State)在LayoutManager中覆盖 computeHorizontalScrollOffset(RecyclerView.State)

Returns
int The horizontal offset of the scrollbar's thumb

也可以看看:

computeHorizontalScrollRange

int computeHorizontalScrollRange ()

计算水平滚动条代表的水平范围。

范围以任意单位表示,必须与 computeHorizontalScrollExtent()computeHorizontalScrollOffset()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeHorizontalScrollRange(RecyclerView.State)在LayoutManager中覆盖 computeHorizontalScrollRange(RecyclerView.State)

Returns
int The total horizontal range represented by the vertical scrollbar

也可以看看:

computeVerticalScrollExtent

int computeVerticalScrollExtent ()

计算垂直滚动条拇指在垂直范围内的垂直范围。 该值用于计算滚动条轨道内的拇指长度。

范围以任意单位表示,必须与 computeVerticalScrollRange()computeVerticalScrollOffset()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeVerticalScrollExtent(RecyclerView.State)在LayoutManager中覆盖 computeVerticalScrollExtent(RecyclerView.State)

Returns
int The vertical extent of the scrollbar's thumb

也可以看看:

computeVerticalScrollOffset

int computeVerticalScrollOffset ()

计算垂直滚动条拇指在垂直范围内的垂直偏移量。 该值用于计算滚动条轨道内的拇指长度。

范围以任意单位表示,必须与 computeVerticalScrollRange()computeVerticalScrollExtent()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeVerticalScrollOffset(RecyclerView.State)在LayoutManager中覆盖 computeVerticalScrollOffset(RecyclerView.State)

Returns
int The vertical offset of the scrollbar's thumb

也可以看看:

computeVerticalScrollRange

int computeVerticalScrollRange ()

计算垂直滚动条代表的垂直范围。

范围以任意单位表示,必须与 computeVerticalScrollExtent()computeVerticalScrollOffset()使用的单位相同。

默认实现返回0。

如果您想支持滚动条, computeVerticalScrollRange(RecyclerView.State)在LayoutManager中覆盖 computeVerticalScrollRange(RecyclerView.State)

Returns
int The total vertical range represented by the vertical scrollbar

也可以看看:

dispatchNestedFling

boolean dispatchNestedFling (float velocityX, 
                float velocityY, 
                boolean consumed)

向嵌套滚动父级派发一个投掷。

应该使用此方法来指示嵌套滚动的孩子已经检测到适用于投掷的适当条件。 通常这意味着触摸滚动以velocity结束,滚动方向沿着可滚动轴线满足或超过minimum fling velocity

如果嵌套的滚动子视图通常会抛出,但它位于其自己的内容的边缘,则可以使用此方法代替该嵌套的滚动父级。 父母可以有选择地消费一下,或者观察孩子的情绪。

Parameters
velocityX float: Horizontal fling velocity in pixels per second
velocityY float: Vertical fling velocity in pixels per second
consumed boolean: true if the child consumed the fling, false otherwise
Returns
boolean true if the nested scrolling parent consumed or otherwise reacted to the fling

dispatchNestedPreFling

boolean dispatchNestedPreFling (float velocityX, 
                float velocityY)

在此视图处理它之前,将嵌套分派给嵌套的滚动父级。

嵌套的预先掷骰事件是嵌套的掷骰事件,触摸截取是触摸的,嵌套的预滚动是嵌套滚动。 dispatchNestedPreFling在子视图消耗它之前,为嵌套的一排中的父视图偏移一个机会以完全消耗该dispatchNestedPreFling 如果此方法返回true ,则嵌套的父视图会消耗该块,并且该视图不应该作为结果滚动。

为了获得更好的用户体验,嵌套滚动链中只有一个视图应该一次使用这个文件。 如果父视图消耗了这个方法,这个方法将返回false。 自定义视图实现应该以两种方式解决这个问题:

  • If a custom view is paged and needs to settle to a fixed page-point, do not call dispatchNestedPreFling; consume the fling and settle to a valid position regardless.
  • If a nested parent does consume the fling, this view should not scroll at all, even to settle back to a valid idle position.

视图也不应该在当前不支持滚动的坐标轴上为嵌套父视图提供快速速度; 一个ScrollView不应该提供一个水平的ScrollView速度给它的父母,因为沿该轴的滚动是不被允许的,并且沿着该运动的速度没有意义。

Parameters
velocityX float: Horizontal fling velocity in pixels per second
velocityY float: Vertical fling velocity in pixels per second
Returns
boolean true if a nested scrolling parent consumed the fling

dispatchNestedPreScroll

boolean dispatchNestedPreScroll (int dx, 
                int dy, 
                int[] consumed, 
                int[] offsetInWindow)

在该视图消耗其任何部分之前,调度正在进行的嵌套滚动的一个步骤。

嵌套的预滚动事件是嵌套的滚动事件是什么触摸拦截要触摸。 dispatchNestedPreScroll为嵌套滚动操作中的父视图提供了在子视图消耗它之前消耗部分或全部滚动操作的机会。

Parameters
dx int: Horizontal scroll distance in pixels
dy int: Vertical scroll distance in pixels
consumed int: Output. If not null, consumed[0] will contain the consumed component of dx and consumed[1] the consumed dy.
offsetInWindow int: Optional. If not null, on return this will contain the offset in local view coordinates of this view from before this operation to after it completes. View implementations may use this to adjust expected input coordinate tracking.
Returns
boolean true if the parent consumed some or all of the scroll delta

dispatchNestedScroll

boolean dispatchNestedScroll (int dxConsumed, 
                int dyConsumed, 
                int dxUnconsumed, 
                int dyUnconsumed, 
                int[] offsetInWindow)

发送正在进行的嵌套滚动的一个步骤。

支持嵌套滚动的视图实现应该调用它来报告正在进行的滚动信息到当前嵌套的滚动父项。 如果嵌套滚动当前没有进行,或者对于该视图嵌套滚动不是enabled ,则此方法不执行任何操作。

在使用滚动事件本身的组件之前,兼容的视图实现也应该调用 dispatchNestedPreScroll

Parameters
dxConsumed int: Horizontal distance in pixels consumed by this view during this scroll step
dyConsumed int: Vertical distance in pixels consumed by this view during this scroll step
dxUnconsumed int: Horizontal scroll distance in pixels not consumed by this view
dyUnconsumed int: Horizontal scroll distance in pixels not consumed by this view
offsetInWindow int: Optional. If not null, on return this will contain the offset in local view coordinates of this view from before this operation to after it completes. View implementations may use this to adjust expected input coordinate tracking.
Returns
boolean true if the event was dispatched, false if it could not be dispatched.

draw

void draw (Canvas c)

手动将此视图(及其所有子项)呈现给定的Canvas。 在调用这个函数之前,视图必须已经完成了一个完整的布局。 在实现视图时,实现onDraw(android.graphics.Canvas)而不是重写此方法。 如果您确实需要重写此方法,请调用超类版本。

Parameters
c Canvas: The Canvas to which the View is rendered.

drawChild

boolean drawChild (Canvas canvas, 
                View child, 
                long drawingTime)

绘制这个视图组的一个孩子。 这个方法负责让画布处于正确的状态。 这包括剪裁,翻译,以便孩子的滚动起点在0,0,并应用任何动画转换。

Parameters
canvas Canvas: The canvas on which to draw the child
child View: Who to draw
drawingTime long: The time at which draw is occurring
Returns
boolean True if an invalidate() was issued

findChildViewUnder

View findChildViewUnder (float x, 
                float y)

找到给定点下的最顶层视图。

Parameters
x float: Horizontal position in pixels to search
y float: Vertical position in pixels to search
Returns
View The child view under (x, y) or null if no matching child is found

findContainingItemView

View findContainingItemView (View view)

遍历给定视图的祖先,并返回包含它的项目视图,也是RecyclerView的直接子视图。 通过调用getChildViewHolder(View)可以使用此返回的视图来获取getChildViewHolder(View)

Parameters
view View: The view that is a descendant of the RecyclerView.
Returns
View The direct child of the RecyclerView which contains the given view or null if the provided view is not a descendant of this RecyclerView.

也可以看看:

findContainingViewHolder

RecyclerView.ViewHolder findContainingViewHolder (View view)

返回包含给定视图的ViewHolder。

Parameters
view View: The view that is a descendant of the RecyclerView.
Returns
RecyclerView.ViewHolder The ViewHolder that contains the given view or null if the provided view is not a descendant of this RecyclerView.

findViewHolderForAdapterPosition

RecyclerView.ViewHolder findViewHolderForAdapterPosition (int position)

返回数据集给定位置的项目的ViewHolder。 findViewHolderForLayoutPosition(int)不同,此方法考虑到了所有尚未反映到布局中的未决适配器更改。 另一方面,如果notifyDataSetChanged()但新的布局尚未计算,则此方法将返回null因为在计算布局之前,新的视图位置是未知的。

此方法仅检查RecyclerView的子项。 如果给定的position的项目没有布置,它将不会创建一个新项目。

当ItemAnimator运行更改动画时,可能有2个ViewHolders表示相同的Item。 在这种情况下,将返回更新后的ViewHolder。

Parameters
position int: The position of the item in the data set of the adapter
Returns
RecyclerView.ViewHolder The ViewHolder at position or null if there is no such item

findViewHolderForItemId

RecyclerView.ViewHolder findViewHolderForItemId (long id)

返回具有给定ID的项目的ViewHolder。 RecyclerView必须使用带有stableIds的适配器才能返回非空值。

此方法仅检查RecyclerView的子项。 如果具有给定的id的项目未布置,则不会创建新项目。 当ItemAnimator运行更改动画时,可能会有2个具有相同ID的ViewHolders。 在这种情况下,将返回更新后的ViewHolder。

Parameters
id long: The id for the requested item
Returns
RecyclerView.ViewHolder The ViewHolder with the given id or null if there is no such item

findViewHolderForLayoutPosition

RecyclerView.ViewHolder findViewHolderForLayoutPosition (int position)

返回数据集中给定位置的项目的ViewHolder,从最新的布局阶段开始。

此方法仅检查RecyclerView的子项。 如果给定的position项目没有布置,它将不会创建一个新项目。

请注意,当适配器内容更改时,ViewHolder位置不会更新,直到下一个布局计算。 如果有未完成的适配器更新,则此方法的返回值可能与您的适配器内容不匹配。 您可以使用# getAdapterPosition()获取getAdapterPosition()的当前适配器位置。

当ItemAnimator运行更改动画时,可能会有2个ViewHolders具有相同的布局位置来表示相同的Item。 在这种情况下,将返回更新后的ViewHolder。

Parameters
position int: The position of the item in the data set of the adapter
Returns
RecyclerView.ViewHolder The ViewHolder at position or null if there is no such item

findViewHolderForPosition

RecyclerView.ViewHolder findViewHolderForPosition (int position)

此方法已弃用。
使用findViewHolderForLayoutPosition(int)findViewHolderForAdapterPosition(int)

Parameters
position int
Returns
RecyclerView.ViewHolder

fling

boolean fling (int velocityX, 
                int velocityY)

以每秒像素为单位,以每个轴的初始速度开始标准投掷。 如果给定的速度低于系统定义的最小值,则此方法将返回false并且不会发生飞掷。

Parameters
velocityX int: Initial horizontal velocity in pixels per second
velocityY int: Initial vertical velocity in pixels per second
Returns
boolean true if the fling was started, false if the velocity was too low to fling or LayoutManager does not support scrolling in the axis fling is issued.

也可以看看:

focusSearch

View focusSearch (View focused, 
                int direction)

由于RecyclerView是一个包含虚拟子项(包含在适配器中但在用户界面中不可见的项目)的ViewGroup集合,因此它采用了与其他ViewGroup不同的更加涉及的焦点搜索策略。

它首先在RecyclerView中进行重点搜索。 如果此搜索找到相对于当前聚焦的视图处于焦点方向的视图,则RecyclerView将该子视为下一个焦点目标。 当它找不到这样的孩子时,它调用onFocusSearchFailed(View, int, Recycler, State)在焦点搜索方向上布置更多视图。 如果LayoutManager添加一个匹配焦点搜索条件的视图,它将作为焦点搜索结果返回。 否则,RecyclerView将调用父级像处理常规ViewGroup一样处理焦点搜索。

当方向为FOCUS_FORWARDFOCUS_BACKWARD ,如果适配器在对焦方向上有更多子对象,则未处于对焦方向的视图仍然是有效的对焦目标,该对象可能不是所需的行为。 为了处理这种情况,RecyclerView将焦点方向转换为绝对方向,并在该方向进行初步焦点搜索。 如果没有视图获得焦点,则在使用原始(相对)方向运行焦点搜索之前,它将调用onFocusSearchFailed(View, int, Recycler, State) 这允许RecyclerView为焦点搜索提供更好的候选,同时仍然允许视图系统从RecyclerView获得焦点,并且如果存在这样的小孩,则将其给予更合适的孩子。

Parameters
focused View: The view that currently has focus
direction int: One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, FOCUS_BACKWARD or 0 for not applicable.
Returns
View A new View that can be the next focus after the focused View

generateLayoutParams

ViewGroup.LayoutParams generateLayoutParams (AttributeSet attrs)

根据提供的属性集返回一组新的布局参数。

Parameters
attrs AttributeSet: the attributes to build the layout parameters from
Returns
ViewGroup.LayoutParams an instance of ViewGroup.LayoutParams or one of its descendants

getAdapter

Adapter getAdapter ()

检索先前设置的适配器;如果未设置适配器,则返回null。

Returns
Adapter The previously set adapter

也可以看看:

getBaseline

int getBaseline ()

将RecyclerView文本基线的偏移量从其顶部边界返回。 如果此RecyclerView的LayoutManager不支持基线对齐,则此方法返回-1。

Returns
int the offset of the baseline within the RecyclerView's bounds or -1 if baseline alignment is not supported

getChildAdapterPosition

int getChildAdapterPosition (View child)

返回给定子视图对应的适配器位置。

Parameters
child View: Child View to query
Returns
int Adapter position corresponding to the given view or NO_POSITION

getChildItemId

long getChildItemId (View child)

返回给定子视图对应的稳定项目标识。

Parameters
child View: Child View to query
Returns
long Item id corresponding to the given view or NO_ID

getChildLayoutPosition

int getChildLayoutPosition (View child)

返回给定子视图的适配器位置以及最近完成的布局传递。

如果尚未反映到布局中的适配器有未决更改,则此位置可能不等于项目的适配器位置。

Parameters
child View: Child View to query
Returns
int Adapter position of the given View as of last layout pass or NO_POSITION if the View is representing a removed item.

getChildPosition

int getChildPosition (View child)

此方法已弃用。
使用getChildAdapterPosition(View)getChildLayoutPosition(View)

Parameters
child View
Returns
int

getChildViewHolder

RecyclerView.ViewHolder getChildViewHolder (View child)

检索给 RecyclerView.ViewHolder视图的 RecyclerView.ViewHolder

Parameters
child View: Child of this RecyclerView to query for its ViewHolder
Returns
RecyclerView.ViewHolder The child view's ViewHolder

getCompatAccessibilityDelegate

RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate ()

返回RecyclerView使用的可访问性委托兼容性实现。

Returns
RecyclerViewAccessibilityDelegate An instance of AccessibilityDelegateCompat used by RecyclerView

getItemAnimator

RecyclerView.ItemAnimator getItemAnimator ()

获取此RecyclerView的当前ItemAnimator。 空返回值表示不存在动画制作者,并且该项目更改将在没有任何动画的情况下发生。 默认情况下,RecyclerView将实例化并使用DefaultItemAnimator的实例。

Returns
RecyclerView.ItemAnimator ItemAnimator The current ItemAnimator. If null, no animations will occur when changes occur to the items in this RecyclerView.

getLayoutManager

RecyclerView.LayoutManager getLayoutManager ()

返回目前负责此RecyclerView布局策略的 RecyclerView.LayoutManager

Returns
RecyclerView.LayoutManager The currently bound LayoutManager

getMaxFlingVelocity

int getMaxFlingVelocity ()

返回此RecyclerView使用的最大投掷速度。

Returns
int The maximum fling velocity used by this RecyclerView.

getMinFlingVelocity

int getMinFlingVelocity ()

返回启动投掷的最低速度。

Returns
int The minimum velocity to start a fling

getPreserveFocusAfterLayout

boolean getPreserveFocusAfterLayout ()

如果RecyclerView应该尝试保留当前聚焦的Adapter Item的焦点,即使在布局计算期间替换表示Item的View也会返回true。

默认情况下,此值为 true

Returns
boolean True if the RecyclerView will try to preserve focused Item after a layout if it loses focus.

也可以看看:

getRecycledViewPool

RecyclerView.RecycledViewPool getRecycledViewPool ()

检索这个RecyclerView的RecyclerView.RecycledViewPool 这个方法永远不会返回null; 如果没有为该视图设置池,则会创建一个新池。 有关更多信息,请参阅setRecycledViewPool

Returns
RecyclerView.RecycledViewPool The pool used to store recycled item views for reuse.

也可以看看:

getScrollState

int getScrollState ()

返回RecyclerView的当前滚动状态。

Returns
int SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING or SCROLL_STATE_SETTLING

hasFixedSize

boolean hasFixedSize ()

Returns
boolean true if the app has specified that changes in adapter content cannot change the size of the RecyclerView itself.

hasNestedScrollingParent

boolean hasNestedScrollingParent ()

如果此视图具有嵌套滚动父级,则返回true。

嵌套滚动父项的存在表示该视图已启动嵌套滚动,并且被视图层次结构的更上层的祖先视图接受。

Returns
boolean whether this view has a nested scrolling parent

hasPendingAdapterUpdates

boolean hasPendingAdapterUpdates ()

返回是否有尚未应用于布局的待定适配器更新。

如果此方法返回true ,则表示用户当前正在查看的内容可能不会反映它们的适配器内容(取决于发生了什么变化)。 您可以使用此信息推迟或取消某些操作。

如果RecyclerView在连接到窗口或更换了适配器后尚未计算出第一个布局,则此方法返回true。

Returns
boolean True if there are some adapter updates which are not yet reflected to layout or false if layout is up to date.

invalidateItemDecorations

void invalidateItemDecorations ()

使所有ItemDecorations无效。 如果RecyclerView具有项目装饰,调用此方法将触发requestLayout()调用。

isAnimating

boolean isAnimating ()

如果RecyclerView当前正在运行一些动画,则返回true。

如果您想在动画完成时收到通知,请使用 isRunning(ItemAnimator.ItemAnimatorFinishedListener)

Returns
boolean True if there are some item animations currently running or waiting to be started.

isAttachedToWindow

boolean isAttachedToWindow ()

如果RecyclerView附加到窗口,则返回true。

Returns
boolean

isComputingLayout

boolean isComputingLayout ()

返回RecyclerView是否正在计算布局。

如果此方法返回true,则意味着RecyclerView处于锁定状态,并且任何尝试更新适配器内容都将导致异常,因为在RecyclerView尝试计算布局时无法更改适配器内容。

在这种状态下运行代码的可能性不大,因为当布局遍历发生时,或者RecyclerView开始滚动以响应系统事件(触摸,辅助功能等)时,框架会调用它。

如果您有一些自定义逻辑来更改适配器内容以响应在布局计算期间可能触发的View回调(例如焦点更改回调),则可能会发生这种情况。 在这些情况下,您应该使用Handler或类似机制推迟更改。

Returns
boolean true if RecyclerView is currently computing a layout, false otherwise

isLayoutFrozen

boolean isLayoutFrozen ()

如果布局和滚动被冻结,则返回true。

Returns
boolean true if layout and scroll are frozen

也可以看看:

isNestedScrollingEnabled

boolean isNestedScrollingEnabled ()

如果对此视图启用嵌套滚动,则返回true。

如果启用了嵌套滚动并且此View类实现支持它,则该视图将在适用时充当嵌套滚动子视图,将有关正在进行的滚动操作的数据转发给兼容且协作的嵌套滚动父级。

Returns
boolean true if nested scrolling is enabled

offsetChildrenHorizontal

void offsetChildrenHorizontal (int dx)

将所有子视图的边界偏移dx像素。 用于在LayoutManagers实现简单的滚动。

Parameters
dx int: Horizontal pixel offset to apply to the bounds of all child views

offsetChildrenVertical

void offsetChildrenVertical (int dy)

将所有子视图的边界偏移dy像素。 用于在LayoutManagers实现简单的滚动。

Parameters
dy int: Vertical pixel offset to apply to the bounds of all child views

onChildAttachedToWindow

void onChildAttachedToWindow (View child)

在项目视图附加到此RecyclerView时调用。

RecyclerView的子类可能希望在附加子视图时执行额外的簿记或修改。 这将在RecyclerView.LayoutManager测量或RecyclerView.LayoutManager视图之前调用,并且是执行这些更改的好时机。

Parameters
child View: Child view that is now attached to this RecyclerView and its associated window

onChildDetachedFromWindow

void onChildDetachedFromWindow (View child)

在从此RecyclerView分离项目视图时调用。

RecyclerView的子类可能希望在子视图分离时执行额外的簿记或修改子视图。 这将被称为RecyclerView.LayoutManager完全分离父窗口和子窗口的子视图。

Parameters
child View: Child view that is now detached from this RecyclerView and its associated window

onDraw

void onDraw (Canvas c)

实施这个来做你的绘画。

Parameters
c Canvas: the canvas on which the background will be drawn

onGenericMotionEvent

boolean onGenericMotionEvent (MotionEvent event)

实现此方法来处理通用运动事件。

通用运动事件描述操纵杆运动,鼠标悬停,触控板触摸,滚轮运动和其他输入事件。 运动事件的source指定了接收的输入类别。 此方法的实现必须在处理事件之前检查源中的位。 以下代码示例显示了这是如何完成的。

源类为SOURCE_CLASS_POINTER通用运动事件传递到指针下的视图。 所有其他通用运动事件都会传送到重点视图。

 public boolean onGenericMotionEvent(MotionEvent event) {
     if (event.isFromSource(InputDevice.SOURCE_CLASS_JOYSTICK)) {
         if (event.getAction() == MotionEvent.ACTION_MOVE) {
             // process the joystick movement...
             return true;
         }
     }
     if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
         switch (event.getAction()) {
             case MotionEvent.ACTION_HOVER_MOVE:
                 // process the mouse hover movement...
                 return true;
             case MotionEvent.ACTION_SCROLL:
                 // process the scroll wheel movement...
                 return true;
         }
     }
     return super.onGenericMotionEvent(event);
 }

Parameters
event MotionEvent: The generic motion event being processed.
Returns
boolean True if the event was handled, false otherwise.

onInterceptTouchEvent

boolean onInterceptTouchEvent (MotionEvent e)

实施此方法来拦截所有触摸屏幕动作事件。 这允许您在事件发送给您的孩子时观看事件,并在任何时候掌握当前手势的所有权。

使用这个函数需要注意,因为它与View.onTouchEvent(MotionEvent)有一个相当复杂的交互,并且使用它需要以正确的方式执行该方法。 活动将按以下顺序收到:

  1. You will receive the down event here.
  2. The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.
  3. For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().
  4. If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.

Parameters
e MotionEvent: The motion event being dispatched down the hierarchy.
Returns
boolean Return true to steal motion events from the children and have them dispatched to this ViewGroup through onTouchEvent(). The current target will receive an ACTION_CANCEL event, and no further messages will be delivered here.

onScrollStateChanged

void onScrollStateChanged (int state)

当此RecyclerView的滚动状态改变时调用。 子类应该使用此方法来响应状态更改而不是显式侦听器。

此方法将始终在侦听器之前调用,但在LayoutManager响应滚动状态更改之后调用。

Parameters
state int: the new scroll state, one of SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING or SCROLL_STATE_SETTLING

onScrolled

void onScrolled (int dx, 
                int dy)

当此RecyclerView的滚动位置改变时调用。 子类应该使用此方法来响应适配器数据集内的滚动而不是显式侦听器。

此方法将始终在侦听器之前调用。 如果一个子类需要在滚动后但在听众跑之前执行任何额外的维护或簿记,这是一个很好的选择。

这与onScrollChanged(int, int, int, int)不同之处在于它接收适配器数据集内任一方向滚动的距离,而不是绝对滚动坐标。 由于RecyclerView无法从数据集中的任意点计算绝对滚动位置,因此onScrollChanged将始终收到与数据集滚动位置不对应的当前值getScrollX()getScrollY() 但是,有些子类可能会选择将这些字段用作特殊偏移量。

Parameters
dx int: horizontal distance scrolled in pixels
dy int: vertical distance scrolled in pixels

onTouchEvent

boolean onTouchEvent (MotionEvent e)

实现此方法来处理触摸屏幕动作事件。

如果此方法用于检测点击操作,建议通过执行并调用performClick()来执行操作。 这将确保一致的系统行为,包括:

  • obeying click sound preferences
  • dispatching OnClickListener calls
  • handling ACTION_CLICK when accessibility features are enabled

Parameters
e MotionEvent: The motion event.
Returns
boolean True if the event was handled, false otherwise.

removeItemDecoration

void removeItemDecoration (RecyclerView.ItemDecoration decor)

从此RecyclerView中删除 RecyclerView.ItemDecoration

给定的装饰将不再影响项目视图的测量和绘制。

Parameters
decor RecyclerView.ItemDecoration: Decoration to remove

也可以看看:

removeOnChildAttachStateChangeListener

void removeOnChildAttachStateChangeListener (RecyclerView.OnChildAttachStateChangeListener listener)

从附加子状态侦听器列表中删除提供的侦听器。

Parameters
listener RecyclerView.OnChildAttachStateChangeListener: Listener to unregister

removeOnItemTouchListener

void removeOnItemTouchListener (RecyclerView.OnItemTouchListener listener)

删除RecyclerView.OnItemTouchListener 它将不再能够拦截触摸事件。

Parameters
listener RecyclerView.OnItemTouchListener: Listener to remove

removeOnScrollListener

void removeOnScrollListener (RecyclerView.OnScrollListener listener)

移除已通知滚动状态或位置发生任何更改的侦听器。

Parameters
listener RecyclerView.OnScrollListener: listener to set or null to clear

requestChildFocus

void requestChildFocus (View child, 
                View focused)

当这个父母的孩子需要关注时调用

Parameters
child View: The child of this ViewParent that wants focus. This view will contain the focused view. It is not necessarily the view that actually has focus.
focused View: The view that is a descendant of child that actually has focus

requestChildRectangleOnScreen

boolean requestChildRectangleOnScreen (View child, 
                Rect rect, 
                boolean immediate)

当该组的小孩想要将特定矩形定位到屏幕上时调用。 ViewGroup重写这可以相信:

  • child will be a direct child of this group
  • rectangle will be in the child's content coordinates

ViewGroup压倒一切应该维护合同:

  • nothing will change if the rectangle is already visible
  • the view port will be scrolled only just enough to make the rectangle visible
    • Parameters
      child View: The direct child making the request.
      rect Rect: The rectangle in the child's coordinates the child wishes to be on the screen.
      immediate boolean: True to forbid animated or delayed scrolling, false otherwise
      Returns
      boolean Whether the group scrolled to handle the operation

requestDisallowInterceptTouchEvent

void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

当孩子不希望这个父母及其祖先用 onInterceptTouchEvent(MotionEvent)拦截触摸事件时 onInterceptTouchEvent(MotionEvent)

这位家长应该将此通知传递给其父母。 这位家长必须在接触期间服从这个要求(也就是说,只有在这位家长收到了或取消后才清除标志。

Parameters
disallowIntercept boolean: True if the child does not want the parent to intercept touch events.

requestLayout

void requestLayout ()

当事情发生变化时调用它,这已经使这个视图的布局无效。 这将安排视图树的布局传递。 当视图层次结构当前处于布局阶段时,不应调用此视图层次结构( isInLayout() 。如果isInLayout()布局,则可以在当前布局阶段结束时接受请求(然后布局将再次运行),或者在当前帧结束之后绘制并发生下一个布局。

覆盖此方法的子类应调用超类方法以正确处理可能的布局错误请求。

scrollBy

void scrollBy (int x, 
                int y)

移动视图的滚动位置。 这将导致致电onScrollChanged(int, int, int, int) ,该视图将失效。

Parameters
x int: the amount of pixels to scroll by horizontally
y int: the amount of pixels to scroll by vertically

scrollTo

void scrollTo (int x, 
                int y)

设置视图的滚动位置。 这将导致致电onScrollChanged(int, int, int, int) ,视图将失效。

Parameters
x int: the x position to scroll to
y int: the y position to scroll to

scrollToPosition

void scrollToPosition (int position)

便捷方法滚动到某个位置。 RecyclerView不实现滚动逻辑,而是将呼叫转发到scrollToPosition(int)

Parameters
position int: Scroll to this adapter position

也可以看看:

sendAccessibilityEventUnchecked

void sendAccessibilityEventUnchecked (AccessibilityEvent event)

此方法的行为与 sendAccessibilityEvent(int)完全相同,但将空白 AccessibilityEvent作为参数,并且不会检查是否启用辅助功能。

如果 View.AccessibilityDelegate已通过调用指定 setAccessibilityDelegate(AccessibilityDelegate)sendAccessibilityEventUnchecked(View, AccessibilityEvent)负责处理此调用。

Parameters
event AccessibilityEvent: The event to send.

setAccessibilityDelegateCompat

void setAccessibilityDelegateCompat (RecyclerViewAccessibilityDelegate accessibilityDelegate)

设置RecyclerView使用的可访问性委托兼容性实现。

Parameters
accessibilityDelegate RecyclerViewAccessibilityDelegate: The accessibility delegate to be used by RecyclerView.

setAdapter

void setAdapter (Adapter adapter)

设置新的适配器以按需提供子视图。

当适配器发生变化时,所有现有的视图都会被循环回池中。 如果池只有一个适配器,它将被清除。

Parameters
adapter Adapter: The new adapter to set, or null to set no adapter.

也可以看看:

setChildDrawingOrderCallback

void setChildDrawingOrderCallback (RecyclerView.ChildDrawingOrderCallback childDrawingOrderCallback)

设置用于绘制儿童的 RecyclerView.ChildDrawingOrderCallback

有关详细信息,请参阅getChildDrawingOrder(int, int) 调用此方法将始终调用setChildrenDrawingOrderEnabled(boolean) 如果childDrawingOrderCallback不为null,则该参数为true,否则为false。

请注意,View的高程可能会覆盖子级绘制顺序。

Parameters
childDrawingOrderCallback RecyclerView.ChildDrawingOrderCallback: The ChildDrawingOrderCallback to be used by the drawing system.

setClipToPadding

void setClipToPadding (boolean clipToPadding)

设置此ViewGroup是否将其子对象填充到其填充中,并将存在填充的任何EdgeEffect调整大小(但不剪切)到填充区域。

默认情况下,子项被剪裁到其父ViewGroup的填充。 此裁剪行为仅在填充不为零时启用。

Parameters
clipToPadding boolean: true to clip children to the padding of the group, and resize (but not clip) any EdgeEffect to the padded region. False otherwise.

setHasFixedSize

void setHasFixedSize (boolean hasFixedSize)

如果RecyclerView可以预先知道RecyclerView的大小不受适配器内容的影响,它可以执行多次优化。 RecyclerView仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小的计算不能取决于子级的大小或其适配器的内容(适配器中的项目数量除外)。

如果您使用RecyclerView属于此类别,请将其设置为true 它将允许RecyclerView在适配器内容更改时避免使整个布局无效。

Parameters
hasFixedSize boolean: true if adapter changes cannot affect the size of the RecyclerView.

setItemAnimator

void setItemAnimator (RecyclerView.ItemAnimator animator)

设置将处理动画的RecyclerView.ItemAnimator ,这些动画涉及对此RecyclerView中项目的更改。 默认情况下,RecyclerView将实例化并使用DefaultItemAnimator的实例。 是否为RecyclerView启用项目动画取决于ItemAnimator以及LayoutManager supports item animations

Parameters
animator RecyclerView.ItemAnimator: The ItemAnimator being set. If null, no animations will occur when changes occur to the items in this RecyclerView.

setItemViewCacheSize

void setItemViewCacheSize (int size)

在将它们添加到可能共享的 recycled view pool之前,设置要保留的屏幕外视图的数量。

离屏视图缓存保持了解连接适配器的变化,允许LayoutManager在未经修改的情况下重用这些视图,而无需返回适配器来重新绑定它们。

Parameters
size int: Number of views to cache offscreen before returning them to the general recycled view pool

setLayoutFrozen

void setLayoutFrozen (boolean frozen)

启用或禁用布局和滚动。 setLayoutFrozen(true)之后,布局请求将被推迟,直到setLayoutFrozen(false) ; 不更新子视图时RecyclerView被冻结, smoothScrollBy(int, int)scrollBy(int, int)scrollToPosition(int)smoothScrollToPosition(int)被丢弃; TouchEvents和GenericMotionEvents被删除; onFocusSearchFailed(View, int, Recycler, State)将不会被调用。

setLayoutFrozen(true)不会阻止应用程序的直接调用 scrollToPosition(int)smoothScrollToPosition(RecyclerView, State, int)

setAdapter(Adapter)swapAdapter(Adapter, boolean)将自动停止冻结。

注意:运行ItemAnimator不会自动停止,调用者有责任调用ItemAnimator.end()。

Parameters
frozen boolean: true to freeze layout and scroll, false to re-enable.

setLayoutManager

void setLayoutManager (RecyclerView.LayoutManager layout)

设置此RecyclerView将使用的 RecyclerView.LayoutManager

与其他适配器支持的视图(如ListViewGridView ,RecyclerView允许客户端代码为子视图提供自定义布局安排。 这些安排由RecyclerView.LayoutManager控制。 必须提供LayoutManager以使RecyclerView正常工作。

为常见用途提供了几种默认策略,如列表和网格。

Parameters
layout RecyclerView.LayoutManager: LayoutManager to use

setNestedScrollingEnabled

void setNestedScrollingEnabled (boolean enabled)

启用或禁用此视图的嵌套滚动。

如果此属性设置为true,则视图将被允许在当前层次结构中使用兼容父视图启动嵌套滚动操作。 如果这个视图没有实现嵌套滚动,这将不起作用。 嵌套滚动正在进行时禁用嵌套滚动具有stopping嵌套滚动的效果。

Parameters
enabled boolean: true to enable nested scrolling, false to disable

setOnScrollListener

void setOnScrollListener (RecyclerView.OnScrollListener listener)

此方法已弃用。
使用addOnScrollListener(OnScrollListener)removeOnScrollListener(OnScrollListener)

设置一个监听器,它将被通知滚动状态或位置的任何变化。

Parameters
listener RecyclerView.OnScrollListener: Listener to set or null to clear

setPreserveFocusAfterLayout

void setPreserveFocusAfterLayout (boolean preserveFocusAfterLayout)

设置RecyclerView是否应该尝试在布局计算之后保留相同的项目。

通常,布局管理器会在布局前后保持焦点视图可见,但有时视图可能会在布局计算中失去焦点,因为它们的状态会发生变化,或者由于类型更改或动画而被替换为另一视图。 在这些情况下,RecyclerView可以自动请求关注新视图。

Parameters
preserveFocusAfterLayout boolean: Whether RecyclerView should preserve focused Item during a layout calculations. Defaults to true.

也可以看看:

setRecycledViewPool

void setRecycledViewPool (RecyclerView.RecycledViewPool pool)

回收视图池允许多个RecyclerView共享一个公共的废料视图池。 如果您有多个使用相同视图类型的适配器的RecyclerView,这可能很有用,例如,如果您有几个数据集,并且ViewPager显示的项目视图类型相同。

Parameters
pool RecyclerView.RecycledViewPool: Pool to set. If this parameter is null a new pool will be created and used.

setRecyclerListener

void setRecyclerListener (RecyclerView.RecyclerListener listener)

注册一个侦听器,每当子视图被回收时都会被通知。

当LayoutManager或RecyclerView决定不再需要子视图时,将调用此侦听器。 如果应用程序将昂贵或重量级数据与项目视图相关联,则这可能是发布或释放这些资源的好地方。

Parameters
listener RecyclerView.RecyclerListener: Listener to register, or null to clear

setScrollingTouchSlop

void setScrollingTouchSlop (int slopConstant)

为特定用例配置滚动触摸边框。 根据常用用途设置RecyclerView的滚动运动阈值。 有效的参数是TOUCH_SLOP_DEFAULTTOUCH_SLOP_PAGING

Parameters
slopConstant int: One of the TOUCH_SLOP_ constants representing the intended usage of this RecyclerView

setViewCacheExtension

void setViewCacheExtension (RecyclerView.ViewCacheExtension extension)

设置一个新的 RecyclerView.ViewCacheExtension由Recycler使用。

Parameters
extension RecyclerView.ViewCacheExtension: ViewCacheExtension to be used or null if you want to clear the existing one.

也可以看看:

smoothScrollBy

void smoothScrollBy (int dx, 
                int dy)

沿任一轴按给定数量的像素动画滚动。

Parameters
dx int: Pixels to scroll horizontally
dy int: Pixels to scroll vertically

smoothScrollToPosition

void smoothScrollToPosition (int position)

开始平滑滚动到适配器位置。

要支持平滑滚动,您必须覆盖 smoothScrollToPosition(RecyclerView, State, int)并创建一个 RecyclerView.SmoothScroller

RecyclerView.LayoutManager负责创建实际的滚动操作。 如果您想提供自定义平滑滚动逻辑, smoothScrollToPosition(RecyclerView, State, int)在LayoutManager中覆盖smoothScrollToPosition(RecyclerView, State, int)

Parameters
position int: The adapter position to scroll to

也可以看看:

startNestedScroll

boolean startNestedScroll (int axes)

沿给定轴开始可嵌套滚动操作。

开始嵌套滚动的视图承诺遵守以下合同:

该视图将在启动滚动操作时调用startNestedScroll。 在触摸滚动的情况下,这对应于最初的ACTION_DOWN 在触摸滚动的情况下,嵌套滚动将以与requestDisallowInterceptTouchEvent(boolean)相同的方式自动终止。 在编程滚动的情况下,调用者必须显式调用stopNestedScroll()来指示嵌套滚动的结束。

如果startNestedScroll返回true,则找到合作父项。 如果返回false,则在下一次滚动之前,调用方可能会忽略此合约的其余部分。 当嵌套滚动正在进行时调用startNestedScroll将返回true。

在滚动的每个增量步骤中,一旦计算出请求的滚动增量,调用者就应该调用dispatchNestedPreScroll 如果它返回true,则嵌套滚动父级至少部分消耗滚动,并且调用者应该调整它滚动的数量。

在应用剩余的滚动增量之后,调用者应该调用dispatchNestedScroll ,同时传递消耗的delta和未消耗的delta。 嵌套的滚动父级可能会以不同的方式处理这些值。 onNestedScroll(View, int, int, int, int)

Parameters
axes int: Flags consisting of a combination of SCROLL_AXIS_HORIZONTAL and/or SCROLL_AXIS_VERTICAL.
Returns
boolean true if a cooperative parent was found and nested scrolling has been enabled for the current gesture.

stopNestedScroll

void stopNestedScroll ()

停止正在进行的嵌套滚动。

当嵌套滚动当前不在进行中时调用此方法是无害的。

stopScroll

void stopScroll ()

停止正在进行的任何当前滚动,例如由 smoothScrollBy(int, int)开始的 fling(int, int)或由触发发起的一次滚动。

swapAdapter

void swapAdapter (Adapter adapter, 
                boolean removeAndRecycleExistingViews)

用提供的交换机替换当前的适配器。 它类似于setAdapter(Adapter)但假定现有适配器和新适配器使用相同的RecyclerView.ViewHolder ,并且不清除RecycledViewPool。

请注意,它仍然会调用AdapterChanged回调函数。

Parameters
adapter Adapter: The new adapter to set, or null to set no adapter.
removeAndRecycleExistingViews boolean: If set to true, RecyclerView will recycle all existing Views. If adapters have stable ids and/or you want to animate the disappearing views, you may prefer to set this to false.

也可以看看:

Protected methods

checkLayoutParams

boolean checkLayoutParams (ViewGroup.LayoutParams p)

Parameters
p ViewGroup.LayoutParams
Returns
boolean

dispatchRestoreInstanceState

void dispatchRestoreInstanceState (SparseArray<Parcelable> container)

覆盖以防止适配器创建的任何视图解冻。

Parameters
container SparseArray: The SparseArray which holds previously saved state.

dispatchSaveInstanceState

void dispatchSaveInstanceState (SparseArray<Parcelable> container)

覆盖以防止冻结由适配器创建的任何视图。

Parameters
container SparseArray: The SparseArray in which to save the view's state.

generateDefaultLayoutParams

ViewGroup.LayoutParams generateDefaultLayoutParams ()

返回一组默认布局参数。 当传递给addView(View)的视图没有设置布局参数时,请求这些参数。 如果返回null,则会从addView引发异常。

Returns
ViewGroup.LayoutParams a set of default layout parameters or null

generateLayoutParams

ViewGroup.LayoutParams generateLayoutParams (ViewGroup.LayoutParams p)

根据提供的布局参数返回一组安全的布局参数。 当ViewGroup传递一个View,其布局参数不能通过checkLayoutParams(android.view.ViewGroup.LayoutParams)的测试时,调用此方法。 此方法应该返回一组适合此ViewGroup的布局参数,可能是通过从指定的一组布局参数中复制适当的属性。

Parameters
p ViewGroup.LayoutParams: The layout parameters to convert into a suitable set of layout parameters for this ViewGroup.
Returns
ViewGroup.LayoutParams an instance of ViewGroup.LayoutParams or one of its descendants

getChildDrawingOrder

int getChildDrawingOrder (int childCount, 
                int i)

返回为此迭代绘制的子的索引。 如果要更改儿童的绘图顺序,请覆盖此选项。 默认情况下,它返回i。

注:为了调用此方法,您必须首先通过调用 setChildrenDrawingOrderEnabled(boolean)来启用子订单。

Parameters
childCount int
i int: The current iteration.
Returns
int The index of the child to draw this iteration.

onAttachedToWindow

void onAttachedToWindow ()

这在视图附加到窗口时被调用。 此时它有一个Surface并将开始绘制。 注意这个函数保证在onDraw(android.graphics.Canvas)之前被调用,但是它可以在第一个onDraw之前的任何时候被调用,包括在onMeasure(int, int)之前或之后。

onDetachedFromWindow

void onDetachedFromWindow ()

这是在视图从窗口分离时调用的。 此时它不再有绘图表面。

onLayout

void onLayout (boolean changed, 
                int l, 
                int t, 
                int r, 
                int b)

当这个视图为每个孩子分配一个大小和位置时,从布局调用。 带孩子的派生类应该覆盖这个方法,并调用他们每个孩子的布局。

Parameters
changed boolean: This is a new size or position for this view
l int: Left position, relative to parent
t int: Top position, relative to parent
r int: Right position, relative to parent
b int: Bottom position, relative to parent

onMeasure

void onMeasure (int widthSpec, 
                int heightSpec)

测量视图及其内容以确定测量宽度和测量高度。 此方法由measure(int, int)调用, measure(int, int)子类覆盖以提供其内容的准确和有效的度量。

合同:覆盖此方法时,您必须致电setMeasuredDimension(int, int)来存储此视图的测量宽度和高度。 如果不这样做,将触发IllegalStateException ,由measure(int, int)引发。 调用超类' onMeasure(int, int)是一种有效的用法。

Measure的基类实现默认为背景大小,除非MeasureSpec允许更大的大小。 子类应覆盖onMeasure(int, int)以提供更好的内容度量。

如果此方法被覆盖,则子类的责任是确保测量的高度和宽度至少为视图的最小高度和宽度( getSuggestedMinimumHeight()getSuggestedMinimumWidth() )。

Parameters
widthSpec int: horizontal space requirements as imposed by the parent. The requirements are encoded with View.MeasureSpec.
heightSpec int: vertical space requirements as imposed by the parent. The requirements are encoded with View.MeasureSpec.

onRequestFocusInDescendants

boolean onRequestFocusInDescendants (int direction, 
                Rect previouslyFocusedRect)

找一个后裔打电话给requestFocus() 当它想要在其子女内请求焦点时由requestFocus(int, android.graphics.Rect)调用。 重写此操作可以自定义您的ViewGroup请求中的请求重点。

Parameters
direction int: One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
previouslyFocusedRect Rect: The rectangle (in this View's coordinate system) to give a finer grained hint about where focus is coming from. May be null if there is no hint.
Returns
boolean Whether focus was taken.

onRestoreInstanceState

void onRestoreInstanceState (Parcelable state)

吊钩允许视图重新应用以前由onSaveInstanceState()生成的内部状态的表示。 这个函数永远不会被调用为null状态。

Parameters
state Parcelable: The frozen state that had previously been returned by onSaveInstanceState().

onSaveInstanceState

Parcelable onSaveInstanceState ()

钩子允许视图生成其内部状态的表示,稍后可用于创建具有相同状态的新实例。 此状态应仅包含不持久或以后不能重建的信息。 例如,您永远不会将当前位置存储在屏幕上,因为当视图的新实例放置在其视图层次结构中时会再次计算该位置。

您可能在此处存储的某些示例:文本视图中的当前光标位置(但通常不是文本本身,因为它存储在内容提供程序或其他永久性存储中),即当前在列表视图中选择的项目。

Returns
Parcelable Returns a Parcelable object containing the view's current dynamic state, or null if there is nothing interesting to save. The default implementation returns null.

onSizeChanged

void onSizeChanged (int w, 
                int h, 
                int oldw, 
                int oldh)

当这个视图的大小发生变化时,这在布局期间被调用。 如果您刚刚添加到视图层次结构中,则会使用旧值0调用。

Parameters
w int: Current width of this view.
h int: Current height of this view.
oldw int: Old width of this view.
oldh int: Old height of this view.

removeDetachedView

void removeDetachedView (View child, 
                boolean animate)

完成删除分离的视图。 此方法将分派脱离窗口事件并通知层次结构更改侦听器。

这种方法的目的是轻量级的,并且不会假定父母或孩子是否应该重绘。 正确使用此方法还将包括进行任何适当的requestLayout()invalidate()调用。 例如,调用者可以在postRunnable执行requestLayout() ,在所有分离/移除调用完成后在下一帧执行requestLayout() ,从而导致在重新绘制视图层次结构之前运行布局。

Parameters
child View: the child to be definitely removed from the view hierarchy
animate boolean: if true and the view has an animation, the view is placed in the disappearing views list, otherwise, it is detached from the window

Hooray!