recycleView實現(xiàn)拖拽以及滑動刪除

recycleview出現(xiàn)已經(jīng)很久了,拖拽以及滑動刪除也很成熟了澳厢,實現(xiàn)方法也有很多,這次主要通過實現(xiàn)ItemTouchHelper來實現(xiàn)的
我不知道簡書怎么上傳錄屏 尷尬剩拢。线得。
先貼代碼吧
因為這個demo是在公司項目上寫的,所以一些基類就不貼了徐伐,不影響閱讀
拖拽輔助類

package com.gtxc.momiwow.Utils

import android.graphics.Canvas
import android.graphics.Color
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.LogUtils

/**
 * http://www.reibang.com/p/8dec938d5ef8
 */
class ItemTouchHelperCallback(val listener: DragLister) : ItemTouchHelper.Callback() {
interface DragLister{
    fun onDragMoveSwap(adapterPosition: Int, adapterPosition1: Int):Boolean
    fun onSwipeDelete(adapterPosition: Int):Boolean
}

    interface StartDragListener {
        /**
         * 該接口用于需要主動回調(diào)拖拽效果的
         * @param viewHolder
         */
        fun onStartDrag(viewHolder: RecyclerView.ViewHolder?)
    }
    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val dragflag =ItemTouchHelper.UP or ItemTouchHelper.DOWN
        val swipFlag =ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
        val flag = makeMovementFlags(dragflag,swipFlag)
        return flag
    }

    override fun isLongPressDragEnabled(): Boolean {
        return true
    }
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
       val result =  listener.onDragMoveSwap(viewHolder.adapterPosition,target.adapterPosition)
       return result
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        LogUtils.e("onSwiped")
              listener.onSwipeDelete(viewHolder.adapterPosition)
    }

    override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        if(actionState==ItemTouchHelper.ACTION_STATE_IDLE) return
        viewHolder?.itemView?.setBackgroundColor(Color.GRAY)
        super.onSelectedChanged(viewHolder, actionState)
    }

    override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
        super.clearView(recyclerView, viewHolder)
        viewHolder?.itemView?.setBackgroundColor(Color.WHITE)
        viewHolder.itemView?.apply {
            alpha=1F
            scaleX=1F
            scaleY= 1F
        }
    }

    override fun onChildDraw(
        c: Canvas,
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        dX: Float,
        dY: Float,
        actionState: Int,
        isCurrentlyActive: Boolean
    ) {
        if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){
            val value = 1-Math.abs(dX)/viewHolder.itemView.width
            viewHolder.itemView.apply {
                alpha=value
                scaleY=value
                scaleX=value
            }
        }
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)

    }
}

adapter

package com.gtxc.momiwow.ui.adapter

import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.LogUtils
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.gtxc.momiwow.R
import com.gtxc.momiwow.Utils.GlideUtils
import com.gtxc.momiwow.Utils.ItemTouchHelperCallback
import com.ksck.logoDesign.app.data.Detail
import com.youth.banner.adapter.BannerAdapter
import org.w3c.dom.Text
import java.util.*

/**
 * 自定義布局贯钩,下面是常見的圖片樣式,更多實現(xiàn)可以看demo,可以自己隨意發(fā)揮
 */
class DragAdapter() : BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_drag),
    ItemTouchHelperCallback.DragLister {


    override fun convert(holder: BaseViewHolder?, item: String?) {
        val imageView = holder?.getView<ImageView>(R.id.ivBanners)
        holder?.setText(R.id.tvPosition,""+holder.layoutPosition)
        item?.let {
            if (imageView != null) {
                GlideUtils.loadImages(imageView, it)
            }
        }
    }


    override fun onDragMoveSwap(adapterPosition: Int, adapterPosition1: Int): Boolean {
        Collections.swap(data, adapterPosition, adapterPosition1);
        notifyItemMoved(adapterPosition, adapterPosition1);
        LogUtils.e("onDragMoveSwap")

        return true
    }

    override fun onSwipeDelete(adapterPosition: Int):Boolean {
        LogUtils.e("onSwipeDelete")
        data.removeAt(adapterPosition)
        notifyItemRemoved(adapterPosition)
        return true
    }


}

activity

package com.gtxc.momiwow.ui

import android.os.Bundle
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.aleyn.mvvm.base.NoViewModel
import com.blankj.utilcode.util.LogUtils
import com.chad.library.adapter.base.listener.OnItemDragListener
import com.gtxc.momiwow.R
import com.gtxc.momiwow.Utils.ItemTouchHelperCallback
import com.gtxc.momiwow.Utils.clickDelay
import com.gtxc.momiwow.base.CommonBaseActivity
import com.gtxc.momiwow.ui.adapter.DragAdapter
import com.gtxc.momiwow.ui.adapter.ImageAdapter
import com.youth.banner.adapter.BannerAdapter
import kotlinx.android.synthetic.main.activity_drag.*
import java.util.*

class DragActivity : CommonBaseActivity<NoViewModel, ViewDataBinding>(),
    ItemTouchHelperCallback.StartDragListener {
    val bannerAdapter by lazy {
        DragAdapter()
    }
    val list = mutableListOf<String>(
      //圖片地址
    )
    lateinit var itemTouchHelper: ItemTouchHelper
    override fun layoutId(): Int {

        return R.layout.activity_drag
    }

    override fun initView(savedInstanceState: Bundle?) {
        super.initView(savedInstanceState)
    }

    override fun initData() {
        reset.clickDelay {
            list.addAll(
                mutableListOf<String>(
                    //圖片地址
                )
            )
            bannerAdapter.setNewData(list)
        }
        recycler.layoutManager = LinearLayoutManager(this)
        recycler.adapter = bannerAdapter
        bannerAdapter.setNewData(
            list
        )
        val callback = ItemTouchHelperCallback(bannerAdapter)
        itemTouchHelper = ItemTouchHelper(callback)
        itemTouchHelper.attachToRecyclerView(recycler)
    }

    override fun initCLick() {
    }

    override fun bindViewModel() {
    }

    override fun onStartDrag(viewHolder: RecyclerView.ViewHolder?) {
        if (viewHolder != null) {
            itemTouchHelper.startDrag(viewHolder)
        }
    }

}

但是這個有個問題 如果gridlayoutmanager的話 橫向刪除和拖拽就無效了,后續(xù)會看看網(wǎng)上其他方案是怎么解決的

Gridlayoutmanager代碼

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val layoutManager =
            recyclerView.layoutManager
        var dragFlags = 0
        var swipeFlags = 0
        if (layoutManager is GridLayoutManager) {
            // 如果是Grid布局角雷,則不能滑動祸穷,只能上下左右拖動
            dragFlags =
                ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
            swipeFlags = 0
        } else if (layoutManager is LinearLayoutManager) {
            // 如果是縱向Linear布局讨韭,則能上下拖動瘸爽,左右滑動
            if ((layoutManager as LinearLayoutManager?)?.orientation === LinearLayoutManager.VERTICAL) {
                dragFlags =
                    ItemTouchHelper.UP or ItemTouchHelper.DOWN
                swipeFlags =
                    ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
            } else {
                // 如果是橫向Linear布局,則能左右拖動谷徙,上下滑動
                swipeFlags =
                    ItemTouchHelper.UP or ItemTouchHelper.DOWN
                dragFlags =
                    ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
            }
        }
        return makeMovementFlags(
            dragFlags,
            swipeFlags
        )
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檩咱,一起剝皮案震驚了整個濱河市揭措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刻蚯,老刑警劉巖绊含,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炊汹,居然都是意外死亡讨便,警方通過查閱死者的電腦和手機霸褒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門技矮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衰倦,“玉大人旁理,你說我怎么就攤上這事韧拒。” “怎么了劲适?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵烹植,是天一觀的道長草雕。 經(jīng)常有香客問我墩虹,道長旬昭,這世上最難降的妖魔是什么菌湃? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任骤坐,我火速辦了婚禮纽绍,結果婚禮上顶岸,老公的妹妹穿的比我還像新娘辖佣。我一直安慰自己,他們只是感情好霞篡,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布污淋。 她就那樣靜靜地躺著寸爆,像睡著了一般仅醇。 火紅的嫁衣襯著肌膚如雪魔种。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音准谚,去河邊找鬼柱衔。 笑死唆铐,一個胖子當著我的面吹牛艾岂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梅猿,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钞啸,長吁一口氣:“原來是場噩夢啊……” “哼体斩!你這毒婦竟也來了絮吵?” 一聲冷哼從身側響起源武,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粱栖,失蹤者是張志新(化名)和其女友劉穎闹究,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體价认,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惠奸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嵌言,死狀恐怖呀页,靈堂內(nèi)的尸體忽然破棺而出蓬蝶,到底是詐尸還是另有隱情培愁,我是刑警寧澤缓窜,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布私股,位于F島的核電站,受9級特大地震影響供嚎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜优床,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一着帽、第九天 我趴在偏房一處隱蔽的房頂上張望竿秆。 院中可真熱鬧启摄,春花似錦歉备、人聲如沸蕾羊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽度气。三九已至,卻和暖如春适荣,著一層夾襖步出監(jiān)牢的瞬間汪诉,已是汗流浹背拟烫。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拇囊,地道東北人迂曲。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像寥袭,于是被迫代替她去往敵國和親路捧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 127,719評論 1 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月传黄,有人笑有人哭杰扫,有人歡樂有人憂愁,有人驚喜有人失落膘掰,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,535評論 28 53
  • 兔子雖然是枚小碩 但學校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,601評論 2 9
  • 信任包括信任自己和信任他人 很多時候章姓,很多事情,失敗识埋、遺憾凡伊、錯過,源于不自信惭聂,不信任他人 覺得自己做不成窗声,別人做不...
    吳氵晃閱讀 6,187評論 4 8