public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) 这个方法返回的是拖拽和滑动的方向。一般使用makeMovementFlags(int,int)或者makeFlag(int,int)构造返回值。我们需要的所有方向的拖拽,不需要滑动,所以可以这么写:
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
复制代码
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//固定位置及tab下面的channel不能拖动
if (viewHolder.getLayoutPosition() < mAdapter.getFixSize() + 1 || viewHolder.getLayoutPosition() > mAdapter.getSelectedSize()) {
return makeMovementFlags(0, 0);
}
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
复制代码
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 当用户拖动item进行移动时会回调这个方法,如果item移动到新的位置,返回true;否则返回false。我们可以在这里实现item的位置交换。要注意的是,某些item是不能改变位置的,所以也要进行处理:
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition(); //拖动的position
int toPosition = target.getAdapterPosition(); //释放的position
//固定位置及tab下面的channel不能拖动
if (toPosition < mAdapter.getFixSize() + 1 || toPosition > mAdapter.getSelectedSize())
return false;
mAdapter.itemMove(fromPosition, toPosition);
return true;
}
复制代码
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) 当用户滑动item的时候会回调此方法,这里我们不需要滑动,不需要重写这个方法 重写完以上两个方法就可以实现拖拽滑动了,但距离我们想要的效果还是有点差距的。
长按拖拽的时候item的颜色会改变,出现阴影,删除按钮会隐藏,原本的位置还会出现一个虚线的方框。
吐槽完了还得继续做啊...... emmmmm...看一下ItemTouchHelper.Callback还有哪些方法能用得上吧
public void onSelectedChanged(ViewHolder viewHolder, int actionState) 当viewHolder被拖拽或滑动时回调(感觉这么翻译有点怪...)。这里有个actionState参数,它的值共有3个:ACTION_STATE_IDLE、ACTION_STATE_SWIPE、ACTION_STATE_DRAG。这里可以根据actionState改变item的样式。