android之RecycleView之ItemTouchHelper 处理拖拽、滑动删除



与RecycleView和ItemTouchHelper.Callback一起使用

ItemTouchHelper内部包含内部类ItemTouchHelper.Callback


public class ItemTouchHelper extends RecyclerView.ItemDecoration        implements RecyclerView.OnChildAttachStateChangeListener {
public abstract static class Callback {
/** @param viewHolder   正在被拖拽的viewHolder.* @param target       被正在拖拽的覆盖的viewHolder*                     dragged.*/
public abstract boolean onMove(RecyclerView recyclerView,ViewHolder viewHolder, ViewHolder target);
/**direction  滑动的方向*                   {@link #UP}, {@link #DOWN},*                   {@link #LEFT} or {@link #RIGHT}*/
public abstract void onSwiped(ViewHolder viewHolder, int direction);
/**makeFlag(ACTION_STATE_IDLE, RIGHT) | makeFlag(ACTION_STATE_SWIPE, LEFT | RIGHT);*/
public abstract int getMovementFlags(RecyclerView recyclerView,ViewHolder viewHolder);
/**被RecyclerView's onDraw调用*/
public void onChildDraw(Canvas c, RecyclerView recyclerView,        ViewHolder viewHolder,        float dX, float dY, int actionState, boolean isCurrentlyActive) {    sUICallback.onDraw(c, recyclerView, viewHolder.itemView, dX, dY, actionState,            isCurrentlyActive);}
/**被RecyclerView's onDraw调用,比较少用到*/
public void onChildDrawOver(Canvas c, RecyclerView recyclerView,        ViewHolder viewHolder,        float dX, float dY, int actionState, boolean isCurrentlyActive) {    sUICallback.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY, actionState,            isCurrentlyActive);}
public boolean isLongPressDragEnabled() {    return true;}
public boolean isItemViewSwipeEnabled() {    return true;}
/**当拖拽或者滑动改变的时候调用,复写是需调用父类方法*/
public void onSelectedChanged(ViewHolder viewHolder, int actionState) {    if (viewHolder != null) {        sUICallback.onSelected(viewHolder.itemView);    }}
……
}
/**默认Item长按时触发拖拽功能*/
public void startDrag(ViewHolder viewHolder) {    if (!mCallback.hasDragFlag(mRecyclerView, viewHolder)) {        Log.e(TAG, "Start drag has been called but swiping is not enabled");        return;    }    if (viewHolder.itemView.getParent() != mRecyclerView) {        Log.e(TAG, "Start drag has been called with a view holder which is not a child of "                + "the RecyclerView which is controlled by this ItemTouchHelper.");        return;    }    obtainVelocityTracker();    mDx = mDy = 0f;    select(viewHolder, ACTION_STATE_DRAG);}
public static interface ViewDropHandler {……}
}


使用: 继承ItemTouchHelper.Callback
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {    public static final float ALPHA_FULL = 1.0f;    private final ItemTouchHelperAdapter mAdapter;    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {        mAdapter = adapter;    }    @Override    public boolean isLongPressDragEnabled() {        return true;    }    @Override    public boolean isItemViewSwipeEnabled() {        return true;    }    @Override    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;            final int swipeFlags = 0;            return makeMovementFlags(dragFlags, swipeFlags);        } else {            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;            final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;            return makeMovementFlags(dragFlags, swipeFlags);        }    }    @Override    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {        if (source.getItemViewType() != target.getItemViewType()) {            return false;        }        // Notify the adapter of the move        mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());        return true;    }    @Override    public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {        // Notify the adapter of the dismissal        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());    }    @Override    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {            // Fade out the view as it is swiped out of the parent's bounds            final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();            viewHolder.itemView.setAlpha(alpha);            viewHolder.itemView.setTranslationX(dX);        } else {            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);        }    }    @Override    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {        // We only want the active item to change        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {            if (viewHolder instanceof ItemTouchHelperViewHolder) {                // Let the view holder know that this item is being moved or dragged                ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;                itemViewHolder.onItemSelected();            }        }        super.onSelectedChanged(viewHolder, actionState);    }    @Override    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {        super.clearView(recyclerView, viewHolder);        viewHolder.itemView.setAlpha(ALPHA_FULL);        if (viewHolder instanceof ItemTouchHelperViewHolder) {            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;            itemViewHolder.onItemClear();        }    }}








更多相关文章

  1. 工程师淘金:开发Android主攻四大方向
  2. android:screenOrientation 强制屏幕方向
  3. Android在应用中固定屏幕方向
  4. LinearLayout中实现水平方向上的两个textview一个居左,一个居右的
  5. Android学习方向

随机推荐

  1. Android常见管理器—短信管理器 SmsManag
  2. android自定义view实现流式布局(FlowLayou
  3. Android之仿B612咔叽滤镜列表操作
  4. 收集一下Android常用的快捷键
  5. Android原生Contacts——界面和数据库
  6. android apk 防止反编译技术第四篇-对抗J
  7. "AndroidStudio 单元测试"-最简单最快的
  8. IOS切图直接作为Android切图使用
  9. Android 通过读取本地Arp表获取当前局域
  10. android图片涂鸦——旋转与文字功能的实