基本信息
文件名称:AndroidRecyclerView自由拖动item的实现代码.docx
文件大小:16.24 KB
总页数:3 页
更新时间:2025-05-30
总字数:约2.55千字
文档摘要

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