第
AndroidRecyclerView自由拖动item的实现代码
看下效果:
接下来我们看如何使用。
1、自定义ItemTouchHelper的callback,用来限制是否可以拖动,以及拖动之后的位置更新:
其中判断条件中的item.isMovable这边是记录该item是否可以拖动,也可以换成其他判断条件比如根据位置判断等。
privatestaticclassMyItemTouchHelperCallbackextendsItemTouchHelper.Callback{
privatefinalItemAdapteritemAdapter;
publicMyItemTouchHelperCallback(ItemAdapteritemAdapter){
this.itemAdapter=itemAdapter;
@Override
publicintgetMovementFlags(@NonNullRecyclerViewrecyclerView,
@NonNullRecyclerView.ViewHolderviewHolder){
intlayoutPosition=viewHolder.getLayoutPosition();
ItemInfoitem=ItemAdapter.getItem(layoutPosition);
if(!item.isMovable()){
//不可拖动
returnmakeMovementFlags(0,0);
//这里表示可以拖动的方向,比如如果不给往上方拖动则去掉ItemTouchHelper.UP
finalintdragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN
|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
returnmakeFlag(ItemTouchHelper.ACTION_STATE_DRAG,dragFlags);
@Override
publicbooleanonMove(@NonNullRecyclerViewrecyclerView,
@NonNullRecyclerView.ViewHolderviewHolderSource,
@NonNullRecyclerView.ViewHolderviewHolderTarget){
intlayoutPosition=viewHolderTarget.getLayoutPosition();
ItemInfoitem=itemAdapter.getItem(layoutPosition);
if(!item.isMovable()){
//不可拖动到这里
returnfalse;
itemAdapter.onMove(viewHolderSource.getAdapterPosition(),
viewHolderTarget.getAdapterPosition());
returntrue;
@Override
publicvoidonSwiped(@NonNullRecyclerView.ViewHolderviewHolder,inti){
}
2、在适配器提供获取item信息和移动之后更新数据的方法给到这个callback使用:
publicItemInfogetItem(intposition){
if(position=0positionmList.size()){
returnmList.get(position);
returnnull;
publicvoidonMove(intsourcePosition,inttargetPosition){
ItemInfoitem=mList.get(sourcePosition);
mList.remove(sourcePosition);
mList.add(targetPosition,item);
notifyItemMoved(sourcePosition,targetPosition);
}
3、使用这个callback类:
ItemTouchHelperitemTo