[Day 27] RecyclerView 下 - itmetouchhelper

重要 method

  • onSwiped(ViewHolder, int)

当产生侧滑效果了,会回调此方法。

我们在这个方法里面从数据源里面移除相应的数据,然後调用notifyXXX方法就行了。

      
          override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
              val position = viewHolder.getAdapterPosition()
              
              //放在Adapter的函式removeItem()
              
              this_adapter.removeItem(position)
            }
      

具体 removeItem function

      
          fun removeItem(position: Int){

          innerList.removeAt(position)

          notifyDataSetChanged()

        }
  • onMove(RecyclerView, ViewHolder, ViewHolder)

当产生拖动效果了,会回调此方法。

我们通常会更新数据源,就比如说,一个ItemView从0拖到了1位置,那麽对应的数据源也需要更改位置

     override fun onMove(
     recyclerView: RecyclerView,
     viewHolder: RecyclerView.ViewHolder,
     target: RecyclerView.ViewHolder
     ): Boolean {

     val fromPos = viewHolder.getAdapterPosition()

     val toPos = target.getAdapterPosition()
     
     // move item in `fromPos` to `toPos` in adapter.
     
     //放在Adapter的函式moveItem()

     this_adapter.moveItem(fromPos,toPos)

     return true  // true if moved, false otherwise
     }
     

具体 moveItem method

如果只有画面上做变动,当资料重新bind 时 还是会依据这个位子的资料 去 bind 画面, 回复原来的样子

      
      fun moveItem(fromPos:Int,toPos:Int){

       // 资料做变动

       val origin = innerList[fromPos]

       innerList.removeAt(fromPos)

       innerList.add(toPos,origin)

       // 画面上做变动

       notifyItemMoved(fromPos, toPos)

    }
      
  • getMovementFlags(RecyclerView, ViewHolder)

    我们需要复写getMovementFlags()去指定允许滑动的方向,使用 makeMovementFlags(int,int)建立returned flags。

    如下:

     override fun getMovementFlags(
     recyclerView: RecyclerView,
    
     viewHolder: RecyclerView.ViewHolder): Int {
    
     // 这里drag支持上下方向,swipe支持左右方向。
    
     val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
    
     val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
    
     return makeMovementFlags(dragFlags,swipeFlags)}
    
  • isItemViewSwipeEnabled()

    是否可以左右侧滑,默认返回true

      
         override fun isItemViewSwipeEnabled(): Boolean {

                return true

            }
      
  • isLongPressDragEnabled()

    是否可以长按上下拖拽,默认返回false

          override fun isLongPressDragEnabled(): Boolean {

                return true

            }
      

在 Acivity 中将 ItemTouchHelper 和 RecyclerView 关联起来



itemTouchHelper.attachToRecyclerView(recyclerview)



<<:  [网页漏洞] 资料库漏洞 - 绵花糖花式吃法

>>:  [Day 27] 从零开始学Python - 科学绘图Matplotlib:画着你,画不出你的骨骼

Day09 - 【概念篇】再谈身份验证与授权

本系列文之後也会置於个人网站 现在,让我们再一次把视线放到「身份验证」和「存取控制」这些名词身上。...

Day8 - TextView(二)

上一篇把"Hello World!"更改成了了 但字体太小了,看不清楚到底打对还...

Day23 vue.js 自订 api (fastapi)

延续昨日 今天来讲讲我们要做的新功能 叫做功能测试 这个功能的目的是 我们公司的大佬希望能够把 测试...

【Day 18】- 像个使用者的爬虫 Selenium

前情提要 前一篇带各位实际使用了汇率爬虫并搭配 openpyxl 这个套件做到执行程序便可读取在 e...

Day20-Go测试(testing)

前言 许多程序语言在主程序写好後,还需要对程序进行测试,这时就需要写测试的档案。在 Go 语言中,测...