kotlin频道@IT·互联网程序员

kotlin + 列表拖拽重新排序、滑动进行删除

2017-05-22  本文已影响243人  Nichool

kotlinTouchHelperDemo

其实在一个月前就想写个kotlin的Demo,想在kotlin成为Android的主流开发语言之前学习学习它.
但是中间一直没有时间,正好这几天Google I/O大会,Kotlin都上热搜了,我利用下班后的时间将写的kotlin例子来和大家分享下,让大家感受感受这门神奇的语言.

kotlin

来,先贴上官方对于这门语言的介绍以及官方为何放弃Java而最终选择kotlin

  1. Kotlin 介绍
  1. 优点
  1. 为何放弃Java
  1. 为何选择Kotlin

简单介绍完了kotlin,说下小编对于这门新语言的感受吧 -- 嗨到不行!

kotlin 在Android Studio 中的使用。

在最新版的AS3.0中将可以直接使用Kotlin作为开发语言,但是3.0之前版本则需要通过安装kotlin的插件来进行配置并使用kotlin。

查找插件.png 配置环境.png

下面我将通过一个功能实现,来带大家看下kotlin的代码.

列表拖拽重新排序 + 滑动删除实现原理

简述原理:主要通过使用recyclerview 提供的ItemTouchHelper 来实现效果。

  1. app/build.gradle 配置 (此处我用的recyclerview版本是25.3.1,可以选择其他版本)

    compile 'com.android.support:recyclerview-v7:25.3.1'
    
  2. RecyclerView.Adapter中使用ItemTouchHelper详解:

    • ItemTouchHelper.Callback 来实现用户手势的控制以及数据的操作

      1. getMovementFlags : 通过调用 getMovementFlags,告诉RecyclerView可以实现的手势类型
      2. onMove : 拖拽时回调的方法,返回值决定是否可以长按拖拽
      3. onSwiped : 左右滑动到满足删除时的回调方法,可以此处执行删除数据
      4. isLongPressDragEnabled : 是否可以长摁拖拽
      5. isItemViewSwipeEnabled : 是否可以滑动删除
      6. onSelectedChanged :状态改变回调方法,可以在此处用于更换图片背景。
      7. clearView :拖动完成回调方法,此处用于更换图片背景



      上面只是简单的对于函数的介绍,详细的操作在下面的代码中可以了解到。

      //kotlin 如果内部类需要访问外部类数据 则要声明为inner
        inner class ItemDragHelperCallback : ItemTouchHelper.Callback() {
            /**
             * 获取可以拖动的方向标志
             * */
            override fun getMovementFlags(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder?): Int {
                //此处返回可以拖动的方向值
                var swipe = 0
                var move = 0
                //此处为 假设recyclerview 不为空
                recyclerView?.let {
                    if (recyclerView.layoutManager is GridLayoutManager) {
                        //如果是网格型 则可以左右上下都可以拖动
                        move = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
                    } else if (recyclerView.layoutManager is LinearLayoutManager) {
                        //支持上下拖动
                        move = ItemTouchHelper.UP or ItemTouchHelper.DOWN
                        //左右滑动删除
                        swipe = ItemTouchHelper.START or ItemTouchHelper.END
                    }
                }
                return ItemTouchHelper.Callback.makeMovementFlags(move, swipe)
            }
      
            override fun onMove(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder?, target: RecyclerView.ViewHolder?): Boolean {
                //此处的返回值 决定是否可以拖动
                if (viewHolder != null && target != null) {
                    //此处不让标题来进行拖动效果 也就是拖动时 标题不会动
                    if (viewHolder.itemViewType == TYPE_TITLE || target.itemViewType == TYPE_TITLE) {
                        return false
                    }
      
                    val fromPos = viewHolder.adapterPosition
                    val toPos = target.adapterPosition
                    //此处为mData不为空时
                    mData?.let {
                        val from = mData[fromPos]
                        mData.removeAt(fromPos)
                        mData.add(toPos, from)
                        //执行交换动画
                        notifyItemMoved(fromPos, toPos)
                        return true
                    }
                }
                //默认不让拖动
                return false
            }
      
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder?, direction: Int) {
                //用于执行滑动删除
            }
      
            //不重写默认是返回true的 如果返回false的话 需要使用ItemTouchHelper的实例方法
            //使用 startDrag 来执行拖拽
            //使用 startSwipe 来执行滑动删除
            override fun isLongPressDragEnabled(): Boolean {
                return true
            }
      
            //是否支持滑动功能
            override fun isItemViewSwipeEnabled(): Boolean {
                return true
            }
      
            /**
             * 此处用于状态变化时 更换图片状态
             * */
            override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
                super.onSelectedChanged(viewHolder, actionState)
                if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                    //显示遮罩
                    viewHolder?.let {
                        if (viewHolder is ItemViewHolder) {
                            viewHolder.mShadow!!.visibility = View.VISIBLE
                        }
                    }
                }
            }
      
            /**
             * 此处当拖拽完成
             * */
            override fun clearView(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder?) {
                super.clearView(recyclerView, viewHolder)
                //隐藏遮罩
                viewHolder?.let {
                    if (viewHolder is ItemViewHolder) {
                        viewHolder.mShadow!!.visibility = View.GONE
                    }
                }
            }
      
        }
      
    • ItemTouchHelper 当需要自定义条件才执行拖拽或者滑动删除,则可以使用startDrag、startSwipe来主动调用开始拖拽与滑动,并isLongPressDragEnabled与 isItemViewSwipeEnabled返回false。

    //开始执行滑动
    ItemTouchHelper.startSwipe(RecyclerView.ViewHolder)
    //开始执行拖拽
    ItemTouchHelper.startDrag(RecyclerView.ViewHolder)
    
    • ItemTouchHelper.attachToRecyclerView 当一切设置好了,则调用此方法设置到RecyclerView中。
     //将recyclerView依附到触摸辅助类
     open fun attachiToRecyclerView(recyclerView: RecyclerView) {
         if (mItemTouchHelper != null && recyclerView != null) {
             mItemTouchHelper.attachToRecyclerView(recyclerView)
         }
     }
    

效果图

拖拽重新排序.gif 滑动删除.gif

给各位客官奉上Github地址:
https://github.com/Nichooool/kotlinTouchHelperDemo
↓↓↓↓↓↓↓↓如果觉得可以的话,请点击下面的喜欢。或者打赏哦,我不会骄傲的。↓↓↓↓↓↓↓↓

上一篇 下一篇

猜你喜欢

热点阅读