android studio拖拽 (android动态添加布局)

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

android实现顶部导航,android可拖动列表

多布局拖拽排序效果图

新建一个可以支持拖拽的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不能被替换:

android实现顶部导航,android可拖动列表

代码截图

android实现顶部导航,android可拖动列表

设置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
            }
}