功能介绍
使用RecyclerView配合ItemTouchHelper实现仿今日头条的频道排序、移动,第一个位置不动,长按拖拽进入编辑模式等功能:
效果如下:
核心代码
//重写ItemTouchHelperAdapter下的2个方法
@Override
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(mData, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onItemDismiss(int position) {
mData.remove(position);
notifyItemRemoved(position);
}
这两个方法监听拖拽动作,修改适配器
重点在ItemDragHelperCallback重写getMovementFlags()方法来指定可以支持的拖放和滑动的方向
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = setDragFlags(recyclerView);
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
想要实现移动,则必须在onMove()方法返回为true,返回false则不移动
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//保持第一个item长按不能移动
if (viewHolder.getAdapterPosition() == 0){
return false;
}
//保持第一个item不能移动
if (target.getAdapterPosition() == 0){
return false;
}else {
mAdapter.onItemMove(viewHolder.getAdapterPosition(),
target.getAdapterPosition());
return true;
}
}
下面附下ItemDragHelperCallback 文件整体代码:
public class ItemDragHelperCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public ItemDragHelperCallback(ItemTouchHelperAdapter mAdapter) {
this.mAdapter = mAdapter;
}
//重写getMovementFlags()方法来指定可以支持的拖放和滑动的方向
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = setDragFlags(recyclerView);
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
private int setDragFlags(RecyclerView recyclerView) {
int dragFlags;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
return dragFlags;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//保持第一个item长按不能移动
if (viewHolder.getAdapterPosition() == 0){
return false;
}
//保持第一个item不能移动
if (target.getAdapterPosition() == 0){
return false;
}else {
mAdapter.onItemMove(viewHolder.getAdapterPosition(),
target.getAdapterPosition());
return true;
}
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
public boolean isLongPressDragEnabled() {
return true;
}
public boolean isItemViewSwipeEnabled() {
return true;
}
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
//滑动动画
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
float width = (float) viewHolder.itemView.getWidth();
float alpha = 1.0f - Math.abs(dX) / width;
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY,
actionState, isCurrentlyActive);
}
}
}
下面附上项目下载地址
http://download.csdn.net/download/shanshan_1117/10201196