Most visited

Recently visited

ItemTouchHelper

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)定义这些行为。

Most of the time, you only need to override onChildDraw but due to limitations of platform prior to Honeycomb, you may need to implement onChildDrawOver as well.

Summary

Nested classes

class ItemTouchHelper.Callback

这个类是ItemTouchHelper和你的应用程序之间的契约。

class ItemTouchHelper.SimpleCallback

一个简单的包装到默认回调,你可以用拖拽和滑动方向来构造这个类,这个类将处理标志回调。

interface ItemTouchHelper.ViewDropHandler

一个可由LayoutManager实现的接口,用于更好地与ItemTouchHelper集成。

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

Constants

ACTION_STATE_DRAG

int ACTION_STATE_DRAG

视图当前正在拖动。

常量值:2(0x00000002)

ACTION_STATE_IDLE

int ACTION_STATE_IDLE

ItemTouchHelper处于空闲状态。 在此状态下,用户没有相关的动作事件,或者最近的动作事件尚未触发滑动或拖动。

常量值:0(0x00000000)

ACTION_STATE_SWIPE

int ACTION_STATE_SWIPE

视图正在被刷新。

常数值:1(0x00000001)

ANIMATION_TYPE_DRAG

int ANIMATION_TYPE_DRAG

拖动视图的动画类型现在将动画到其最终位置。

常量值:8(0x00000008)

ANIMATION_TYPE_SWIPE_CANCEL

int ANIMATION_TYPE_SWIPE_CANCEL

未完全滑动的视图的动画类型将生成回到原始位置。

常量值:4(0x00000004)

ANIMATION_TYPE_SWIPE_SUCCESS

int ANIMATION_TYPE_SWIPE_SUCCESS

已成功刷新的视图的动画类型。

常量值:2(0x00000002)

DOWN

int DOWN

向下方向,用于滑动和拖动控制。

常量值:2(0x00000002)

END

int END

水平末端方向。 根据RecyclerView的布局方向分解为左或右。 用于滑动和拖动控制。

常量值:32(0x00000020)

LEFT

int LEFT

左方向,用于滑动和拖动控制。

常量值:4(0x00000004)

RIGHT

int RIGHT

正确的方向,用于滑动和拖动控制。

常量值:8(0x00000008)

START

int START

水平的起始方向。 根据RecyclerView的布局方向分解为左或右。 用于滑动和拖动控制。

常量值:16(0x00000010)

UP

int UP

向上方向,用于滑动和拖动控制。

常数值:1(0x00000001)

Public constructors

ItemTouchHelper

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.

Public methods

attachToRecyclerView

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.

getItemOffsets

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.

onChildViewAttachedToWindow

void onChildViewAttachedToWindow (View view)

当视图附加到RecyclerView时调用。

Parameters
view View: The View which is attached to the RecyclerView

onChildViewDetachedFromWindow

void onChildViewDetachedFromWindow (View view)

当视图从RecyclerView分离时调用。

Parameters
view View: The View which is being detached from the RecyclerView

onDraw

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

onDrawOver

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.

startDrag

void startDrag (RecyclerView.ViewHolder viewHolder)

开始拖动提供的ViewHolder。 默认情况下,当长按View时,ItemTouchHelper会开始拖动。 您可以通过覆盖isLongPressDragEnabled()来禁用该行为。

对于这种方法的工作:

  • The provided ViewHolder must be a child of the RecyclerView to which this ItemTouchHelper is attached.
  • ItemTouchHelper.Callback must have dragging enabled.
  • There must be a previous touch event that was reported to the ItemTouchHelper through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener grabs previous events, this should work as expected.
For example, if you would like to let your user to be able to drag an Item by touching one of its descendants, you may implement it as follows:
     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.

也可以看看:

startSwipe

void startSwipe (RecyclerView.ViewHolder viewHolder)

开始刷新提供的ViewHolder。 默认情况下,当用户将手指(或鼠标指针)滑过视图时,ItemTouchHelper开始滑动视图。 您可以通过覆盖ItemTouchHelper.Callback来禁用此行为

对于这种方法的工作:

  • The provided ViewHolder must be a child of the RecyclerView to which this ItemTouchHelper is attached.
  • ItemTouchHelper.Callback must have swiping enabled.
  • There must be a previous touch event that was reported to the ItemTouchHelper through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener grabs previous events, this should work as expected.
For example, if you would like to let your user to be able to swipe an Item by touching one of its descendants, you may implement it as follows:
     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.

Hooray!