适配器就是直接绑定 item布局,但是要扩展ItemTouchHelperAdapter接口

package com.daobo.wand.ui.adapterimport android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.daobo.wand.BR
import com.daobo.wand.R
import com.daobo.wand.ui.FunctionItem
import com.daobo.wand.ui.listener.ItemTouchHelperAdapter
import com.daobo.wand.ui.viewbean.FuncItemViewBean
import java.util.*
import kotlin.collections.ArrayListclass FunctionMenuAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>, ItemTouchHelperAdapter {private var data = ArrayList<FunctionItem>()private var context: Context? = nullconstructor(context: Context, data: ArrayList<FunctionItem>) {this.context = contextif (data != null) {this.data = data}}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {return FunctionViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context),R.layout.layout_menu_function, parent, false))}override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {val fi = data[position]var funcItemViewBean = FuncItemViewBean()funcItemViewBean.IvImgSrc = context!!.resources.getIdentifier(fi.mImageUrl, "drawable",context!!.packageName)funcItemViewBean.Name = fi.mNamevar binding : ViewDataBinding = DataBindingUtil.getBinding(holder.itemView)!!binding.setVariable(BR.funcItem, funcItemViewBean)binding.executePendingBindings()}override fun getItemCount(): Int {return data.size}override fun onItemMove(holder: RecyclerView.ViewHolder, fromPosition: Int, targetPosition: Int) {if (fromPosition < data.size && targetPosition < data.size) {Collections.swap(data, fromPosition, targetPosition)notifyItemMoved(fromPosition, targetPosition)}}override fun onItemSelect(holder: RecyclerView.ViewHolder) {holder.itemView.scaleX = 0.8fholder.itemView.scaleY = 0.8f}override fun onItemClear(holder: RecyclerView.ViewHolder) {holder.itemView.scaleX = 1.0fholder.itemView.scaleY = 1.0f}override fun onItemDismiss(holder: RecyclerView.ViewHolder) {}inner class FunctionViewHolder(dataBinding: ViewDataBinding) : RecyclerView.ViewHolder(dataBinding.root)}

上面配置做了touch选择处理,同时我们要做移动处理

定义接口:

package com.daobo.wand.ui.listenerimport androidx.recyclerview.widget.RecyclerViewinterface ItemTouchHelperAdapter {fun onItemMove(holder: RecyclerView.ViewHolder, fromPosition: Int, targetPosition: Int)fun onItemSelect(holder: RecyclerView.ViewHolder)fun onItemClear(holder: RecyclerView.ViewHolder)fun onItemDismiss(holder: RecyclerView.ViewHolder)
}

定义一个DefaultItemCallback 扩展 recyclerview.widget.ItemTouchHelper.CallBack

package com.daobo.wand.ui.listenerimport androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerViewclass DefaultItemCallback : ItemTouchHelper.Callback {private var touchHelperAdapter: ItemTouchHelperAdapterconstructor(touchHelperAdapter: ItemTouchHelperAdapter) {this.touchHelperAdapter = touchHelperAdapter}override fun getMovementFlags(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder): Int {val dragFlags =ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT //允许上下左右的拖动return ItemTouchHelper.Callback.makeMovementFlags(dragFlags, 0)}override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder): Boolean {touchHelperAdapter.onItemMove(viewHolder,viewHolder.adapterPosition,target.adapterPosition)return true}override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)touchHelperAdapter.onItemSelect(viewHolder!!)}override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {if (!recyclerView.isComputingLayout)touchHelperAdapter.onItemClear(viewHolder)}override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}override fun isLongPressDragEnabled(): Boolean {return true}override fun isItemViewSwipeEnabled(): Boolean {return false}
}

在做一个封装 helper

package com.daobo.wand.ui.listenerimport androidx.recyclerview.widget.ItemTouchHelperclass DefaultItemTouchHelper : ItemTouchHelper {constructor(callback: ItemTouchHelper.Callback): super(callback)
}

然后在fragment或者activity中使用的时候绑定GridLayoutManager:

{
blockAdapter = FunctionMenuAdapter(this, selData!!)
recyclerViewExist.layoutManager = GridLayoutManager(this, 4)
recyclerViewExist.adapter = blockAdapter
recyclerViewExist.addItemDecoration(SpaceItemDecoration(4, dip2px(this, 10.0F)))val callback = DefaultItemCallback(blockAdapter!!)
val helper = DefaultItemTouchHelper(callback)
helper.attachToRecyclerView(recyclerViewExist)itemWidth = getAtyWidth(this) / 4 + dip2px(this, 2.0F)
resetEditHeight(selData!!.size)
......
}private fun dip2px(context: Context, dpValue: Float): Int {val scale = context.resources.displayMetrics.densityreturn (dpValue * scale + 0.5f).toInt()
}private fun getAtyWidth(context: Context): Int {return try {val mDm = DisplayMetrics()(context as Activity).windowManager.defaultDisplay.getMetrics(mDm)mDm.widthPixels} catch (e: Exception) {0}}private fun resetEditHeight(size: Int) {var size = sizetry {if (size == 0) {size = 1}var row = size / 4 + if (size % 4 > 0) 1 else 0if (row <= 0)row = 1if (lastRow != row) {lastRow = rowval params = recyclerViewExist.layoutParamsparams.height = itemWidth * rowrecyclerViewExist.layoutParams = params}} catch (e: Exception) {e.printStackTrace()}}

recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序相关推荐

  1. 用RecyclerView实现类似支付宝应用图标拖拽排序以及增删管理的功能

    1. 效果图 2. 基本的功能 在非编辑状态下可以直接点击图标进行跳转 在编辑状态可以拖拽.添加.删除操作 已被添加过的不能再次添加 3. 实现的思路 用两个RecyclerView实现,同时维护两个 ...

  2. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

  3. android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item

    前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门. 今天介绍一个RecyclerView I ...

  4. RecyclerView长按拖拽排序 ,缩短长按响应时间,长按0.1秒就可以开始拖动

    RecyclerView长按拖拽排序 ,缩短长按响应时间,长按0.1秒就可以开始拖动 度娘搜索RecyclerView长按拖拽排序,很多文章讲解,没找到缩短长按响应时间的,所以自己研究了一下 先看效果 ...

  5. draggable布局 vue_Vue.Draggable (拖拽排序)

    安装 npm install vuedraggable 1 引入 import draggable from 'vuedraggable' 1 基础用法 定义一个json串 list,实现它的拖拽排序 ...

  6. JQuery UI 拖拽排序

    html代码: <div class="sortable"><div class="item"><img src="im ...

  7. vue可视化拖拽组件模板_基于 Vue 丝滑般拖拽排序组件VueSlicksort

    今天给大家分享一个功能超强的自由拖拽排序组件VueSlicksort. vue-slicksort 一款功能强大的可拖拽的vue.js组件.拥有丝滑般拖拽动画效果,支持水平/垂直/网格拖拽排序.还可以 ...

  8. Android表格拖拽排序,Android 拖拽排序控件 DragGridView

    Android 拖拽排序控件 DragGridView Android 开发中,我们经常会遇到条目拖拽排序的需求,特别是在新闻类应用中就更普遍了.其实,我们在网上可以搜到许多关于拖拽排序的自定义控件, ...

  9. element ui 图片控件 排序_vuedraggable+element ui实现页面控件拖拽排序效果

    项目要实现一些控件的拖拽排序.从而找到了这款vuedraggable控件,供大家参考,具体内容如下 如上图要实现这些控件的拖拽排序 这是拖拽后 由于公司网络的原因,项目没有使用npm,都是使用的引入的 ...

最新文章

  1. Django中使用UpdateView修改数据后,返回列表页
  2. 01 背包问题 --- 待续 - -
  3. CTFshow 文件包含 web79
  4. SDRAM工作的大体流程
  5. ubuntu下载工具aria2 uGet
  6. 回复邮件时如何不要邮件头_如何为阅读,点击和回复率达到100%的CEO设计一封冷邮件...
  7. linux内核定时器使用
  8. 【版本更新】CAD组件Aspose.CAD 9月新版V17.9发布 | 支持IFC格式
  9. 我对Pass、SaaS、IaaS的理解
  10. c语言自己建个题库随机出题,自己建个题库随机出题 让学习效率大大提高
  11. 游戏是怎么赚钱的?(科普篇 )
  12. pytorch optim灵活传参
  13. 一小时快速建立数据分析平台
  14. metro样式开机启动菜单_如何在Windows 8中获取Metro风格的开始菜单和开始按钮
  15. 怎么修改windows10在cmd下的用户名为英文名
  16. JUNIPER路由器中常用命令总结
  17. 微信支付分700分,有什么好处?
  18. web开发要学习什么技术,HTML实体字符列表
  19. 通过QQ号码获取QQ头像、昵称以及空间头像
  20. 罕见!谷歌员工成立工会,国外网友:员工维权行动已席卷硅谷!

热门文章

  1. You must define a PAYPAL_PAYFLOW_VENDOR_ID setting
  2. compiz把xfce4系统搞崩溃后的恢复方案
  3. php进程守护进程,php 多进程实现守护进程的实例代码
  4. springboot报错---@RunWith(SpringRunner.class)
  5. js面向对象-组合使用构造函数模式和原型模式(使用最广泛、认同度最高)
  6. 为什么我们需要Maven
  7. django中的认证登陆与用户的创建
  8. C# 结构体 枚举类型
  9. Chipmunk僵尸物理对象的出现和解决(七)
  10. 随便写写2014创业记(二)