最近项目需要一个多种类型图片之间的互相拖拽的效果,之前,由于是采用RecleView嵌套RecleView实现的,所以只能支持单个RecleView之间的相互拖拽,后来采用BaseRecyclerViewAdapterHelper开源库的多布局使用一个RecleView来实现不同类型的拖拽功能。类型是于下面这种布局,不同类型的图片可以互相拖拽:

多布局拖拽排序效果图
新建一个可以支持拖拽的adapter,继承自BaseItemDraggableAdapter,由于我们要实现拖拽功能,所以自能通过代理的方式来实现多布局,具体可以参考开源库BaseRecyclerViewAdapterHelper,实例代码如下:
init {
multiTypeDelegate = object : MultiTypeDelegate<EditFangKanBean>() {
override fun getItemType(t: EditFangKanBean): Int {
return t.viewType
}
}
multiTypeDelegate.registerItemType(ItemTittleView, R.layout.item_drag_tittle)
.registerItemType(ItemImageView, R.layout.item_drag_image)
.registerItemType(ItemLineView, R.layout.item_drag_line)
.registerItemType(ItemVideoView, R.layout.item_video_image)
}
init {
multiTypeDelegate = object : MultiTypeDelegate<EditFangKanBean>() {
override fun getItemType(t: EditFangKanBean): Int {
return t.viewType
}
}
multiTypeDelegate.registerItemType(ItemTittleView, R.layout.item_drag_tittle)
.registerItemType(ItemImageView, R.layout.item_drag_image)
.registerItemType(ItemLineView, R.layout.item_drag_line)
.registerItemType(ItemVideoView, R.layout.item_video_image)
}
重写ItemDragAndSwipeCallback,实现getMovementFlags和onMove方法,可以在getMovementFlags方法中限制某些item不支持拖动,在onMove方法中限制拖动结束后item不能被替换:

代码截图

设置adapter.enableDragItem来激活拖拽功能。
以设置adapter的setOnItemDragListener回调,重写onItemDragMoving,onItemDragStart,onItemDragEn3个方法,在这三个方法中来进行拖拽的业务逻辑处理。
最后,将GridLayoutManager根据类型设置成一行3列和一行一列。
vrFangkanEditAdapter.setSpanSizeLookup { _, position ->
when (vrFangkanEditAdapter.data[position].viewType) {
ItemTittleView, ItemLineView -> return@setSpanSizeLookup 3
else -> return@setSpanSizeLookup 1
}
}