public class ItemTouchHelper
extends RecyclerView.ItemDecoration
implements RecyclerView.OnChildAttachStateChangeListener
java.lang.Object | ||
↳ | android.support.v7.widget.RecyclerView.ItemDecoration | |
↳ | android.support.v7.widget.helper.ItemTouchHelper |
这是一个实用工具类,用于添加轻扫以将拖放支持拖放到RecyclerView。
它与RecyclerView和Callback类一起工作,该类可配置启用哪种类型的交互,并在用户执行这些操作时接收事件。
根据您支持的功能,您应该覆盖 onMove(RecyclerView, ViewHolder, ViewHolder)
和/或 onSwiped(ViewHolder, int)
。
该类设计用于任何LayoutManager,但在某些情况下,可以通过扩展 ItemTouchHelper.Callback
类中的方法或在LayoutManager中实现 ItemTouchHelper.ViewDropHandler
接口来优化自定义LayoutManager。
默认情况下,ItemTouchHelper移动项目的translateX / Y属性以重新定位它们。 在比Honeycomb早的平台上,ItemTouchHelper使用画布转换和View的可见性属性来移动项目以响应触摸事件。 您可以通过覆盖onChildDraw(Canvas, RecyclerView, ViewHolder, float, float, int, boolean)
或onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int, boolean)
定义这些行为。
onChildDraw
but due to limitations of platform prior to Honeycomb, you may need to implement
onChildDrawOver
as well.
Nested classes |
|
---|---|
class |
ItemTouchHelper.Callback 这个类是ItemTouchHelper和你的应用程序之间的契约。 |
class |
ItemTouchHelper.SimpleCallback 一个简单的包装到默认回调,你可以用拖拽和滑动方向来构造这个类,这个类将处理标志回调。 |
interface |
ItemTouchHelper.ViewDropHandler 一个可由LayoutManager实现的接口,用于更好地与 |
Constants |
|
---|---|
int |
ACTION_STATE_DRAG 视图当前正在拖动。 |
int |
ACTION_STATE_IDLE ItemTouchHelper处于空闲状态。 |
int |
ACTION_STATE_SWIPE 视图正在被刷新。 |
int |
ANIMATION_TYPE_DRAG 拖动视图的动画类型现在将动画到其最终位置。 |
int |
ANIMATION_TYPE_SWIPE_CANCEL 未完全滑动的视图的动画类型将生成回到原始位置。 |
int |
ANIMATION_TYPE_SWIPE_SUCCESS 已成功刷新的视图的动画类型。 |
int |
DOWN 向下方向,用于滑动和拖动控制。 |
int |
END 水平末端方向。 |
int |
LEFT 左方向,用于滑动和拖动控制。 |
int |
RIGHT 正确的方向,用于滑动和拖动控制。 |
int |
START 水平的起始方向。 |
int |
UP 向上方向,用于滑动和拖动控制。 |
Public constructors |
|
---|---|
ItemTouchHelper(ItemTouchHelper.Callback callback) 创建一个ItemTouchHelper,它将与给定的回调一起使用。 |
Public methods |
|
---|---|
void |
attachToRecyclerView(RecyclerView recyclerView) 将ItemTouchHelper附加到提供的RecyclerView。 |
void |
getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) 检索给定项目的任何偏移量。 |
void |
onChildViewAttachedToWindow(View view) 当视图附加到RecyclerView时调用。 |
void |
onChildViewDetachedFromWindow(View view) 当视图从RecyclerView分离时调用。 |
void |
onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) 在提供给RecyclerView的Canvas中绘制任何适当的装饰。 |
void |
onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) 在提供给RecyclerView的Canvas中绘制任何适当的装饰。 |
void |
startDrag(RecyclerView.ViewHolder viewHolder) 开始拖动提供的ViewHolder。 |
void |
startSwipe(RecyclerView.ViewHolder viewHolder) 开始刷新提供的ViewHolder。 |
Inherited methods |
|
---|---|
From class android.support.v7.widget.RecyclerView.ItemDecoration
|
|
From class java.lang.Object
|
|
From interface android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener
|
int ACTION_STATE_DRAG
视图当前正在拖动。
常量值:2(0x00000002)
int ACTION_STATE_IDLE
ItemTouchHelper处于空闲状态。 在此状态下,用户没有相关的动作事件,或者最近的动作事件尚未触发滑动或拖动。
常量值:0(0x00000000)
int ACTION_STATE_SWIPE
视图正在被刷新。
常数值:1(0x00000001)
int ANIMATION_TYPE_DRAG
拖动视图的动画类型现在将动画到其最终位置。
常量值:8(0x00000008)
int ANIMATION_TYPE_SWIPE_CANCEL
未完全滑动的视图的动画类型将生成回到原始位置。
常量值:4(0x00000004)
int ANIMATION_TYPE_SWIPE_SUCCESS
已成功刷新的视图的动画类型。
常量值:2(0x00000002)
int DOWN
向下方向,用于滑动和拖动控制。
常量值:2(0x00000002)
int END
水平末端方向。 根据RecyclerView的布局方向分解为左或右。 用于滑动和拖动控制。
常量值:32(0x00000020)
int LEFT
左方向,用于滑动和拖动控制。
常量值:4(0x00000004)
int RIGHT
正确的方向,用于滑动和拖动控制。
常量值:8(0x00000008)
int START
水平的起始方向。 根据RecyclerView的布局方向分解为左或右。 用于滑动和拖动控制。
常量值:16(0x00000010)
int UP
向上方向,用于滑动和拖动控制。
常数值:1(0x00000001)
ItemTouchHelper (ItemTouchHelper.Callback callback)
创建一个ItemTouchHelper,它将与给定的回调一起使用。
您可以通过attachToRecyclerView(RecyclerView)
将ItemTouchHelper附加到RecyclerView。 在附加后,它会向RecyclerView添加一个项目装饰,一个onItemTouchListener和一个Child附加/分离侦听器。
Parameters | |
---|---|
callback |
ItemTouchHelper.Callback : The Callback which controls the behavior of this touch helper. |
void attachToRecyclerView (RecyclerView recyclerView)
将ItemTouchHelper附加到提供的RecyclerView。 如果TouchHelper已经连接到RecyclerView,它将首先与前一个分离。 您可以使用null
将此方法从当前的RecyclerView中分离出来。
Parameters | |
---|---|
recyclerView |
RecyclerView : The RecyclerView instance to which you want to add this helper or null if you want to remove ItemTouchHelper from the current RecyclerView. |
void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
检索给定项目的任何偏移量。 outRect
每个字段指定项目视图应插入的像素数量,类似于填充或边距。 默认实现将outRect的边界设置为0并返回。
如果此ItemDecoration不影响项目视图的位置,则应在返回之前将 outRect
(左侧,顶部,右侧,底部)的所有四个字段设置为零。
如果您需要访问Adapter以获取其他数据,则可以致电 getChildAdapterPosition(View)
以获取View的适配器位置。
Parameters | |
---|---|
outRect |
Rect : Rect to receive the output. |
view |
View : The child view to decorate |
parent |
RecyclerView : RecyclerView this ItemDecoration is decorating |
state |
RecyclerView.State : The current state of RecyclerView. |
void onChildViewAttachedToWindow (View view)
当视图附加到RecyclerView时调用。
Parameters | |
---|---|
view |
View : The View which is attached to the RecyclerView |
void onChildViewDetachedFromWindow (View view)
当视图从RecyclerView分离时调用。
Parameters | |
---|---|
view |
View : The View which is being detached from the RecyclerView |
void onDraw (Canvas c, RecyclerView parent, RecyclerView.State state)
在提供给RecyclerView的Canvas中绘制任何适当的装饰。 任何由此方法绘制的内容都将在绘制项目视图之前绘制,并将出现在视图下方。
Parameters | |
---|---|
c |
Canvas : Canvas to draw into |
parent |
RecyclerView : RecyclerView this ItemDecoration is drawing into |
state |
RecyclerView.State : The current state of RecyclerView |
void onDrawOver (Canvas c, RecyclerView parent, RecyclerView.State state)
在提供给RecyclerView的Canvas中绘制任何适当的装饰。 任何由此方法绘制的内容都将在绘制项目视图后绘制,并因此出现在视图上。
Parameters | |
---|---|
c |
Canvas : Canvas to draw into |
parent |
RecyclerView : RecyclerView this ItemDecoration is drawing into |
state |
RecyclerView.State : The current state of RecyclerView. |
void startDrag (RecyclerView.ViewHolder viewHolder)
开始拖动提供的ViewHolder。 默认情况下,当长按View时,ItemTouchHelper会开始拖动。 您可以通过覆盖isLongPressDragEnabled()
来禁用该行为。
对于这种方法的工作:
ItemTouchHelper.Callback
must have dragging enabled.viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { mItemTouchHelper.startDrag(viewHolder); } return false; } });
Parameters | |
---|---|
viewHolder |
RecyclerView.ViewHolder : The ViewHolder to start dragging. It must be a direct child of RecyclerView. |
也可以看看:
void startSwipe (RecyclerView.ViewHolder viewHolder)
开始刷新提供的ViewHolder。 默认情况下,当用户将手指(或鼠标指针)滑过视图时,ItemTouchHelper开始滑动视图。 您可以通过覆盖ItemTouchHelper.Callback
来禁用此行为
对于这种方法的工作:
ItemTouchHelper.Callback
must have swiping enabled.viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { mItemTouchHelper.startSwipe(viewHolder); } return false; } });
Parameters | |
---|---|
viewHolder |
RecyclerView.ViewHolder : The ViewHolder to start swiping. It must be a direct child of RecyclerView. |