當產生側滑效果了,會回調此方法。
我們在這個方法裡面從數據源里面移除相應的數據,然後調用notifyXXX方法就行了。
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.getAdapterPosition()
//放在Adapter的函式removeItem()
this_adapter.removeItem(position)
}
fun removeItem(position: Int){
innerList.removeAt(position)
notifyDataSetChanged()
}
當產生拖動效果了,會回調此方法。
我們通常會更新數據源,就比如說,一個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
}
如果只有畫面上做變動,當資料重新bind 時 還是會依據這個位子的資料 去 bind 畫面, 回復原來的樣子
fun moveItem(fromPos:Int,toPos:Int){
// 資料做變動
val origin = innerList[fromPos]
innerList.removeAt(fromPos)
innerList.add(toPos,origin)
// 畫面上做變動
notifyItemMoved(fromPos, toPos)
}
我們需要複寫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)}
是否可以左右側滑,默認返回true
override fun isItemViewSwipeEnabled(): Boolean {
return true
}
是否可以長按上下拖拽,默認返回false
override fun isLongPressDragEnabled(): Boolean {
return true
}
itemTouchHelper.attachToRecyclerView(recyclerview)