pull/32/head
parent
67aeb9404d
commit
6a07b6544e
@ -0,0 +1,127 @@ |
||||
package io.legado.app.help |
||||
|
||||
|
||||
import androidx.recyclerview.widget.GridLayoutManager |
||||
import androidx.recyclerview.widget.ItemTouchHelper |
||||
import androidx.recyclerview.widget.LinearLayoutManager |
||||
import androidx.recyclerview.widget.RecyclerView |
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout |
||||
import androidx.viewpager.widget.ViewPager |
||||
|
||||
/** |
||||
* Created by GKF on 2018/3/16. |
||||
*/ |
||||
|
||||
class ItemTouchCallback : ItemTouchHelper.Callback() { |
||||
|
||||
private var swipeRefreshLayout: SwipeRefreshLayout? = null |
||||
private var viewPager: ViewPager? = null |
||||
|
||||
/** |
||||
* Item操作的回调 |
||||
*/ |
||||
var onItemTouchCallbackListener: OnItemTouchCallbackListener? = null |
||||
|
||||
/** |
||||
* 是否可以拖拽 |
||||
*/ |
||||
var isCanDrag = false |
||||
/** |
||||
* 是否可以被滑动 |
||||
*/ |
||||
var isCanSwipe = false |
||||
|
||||
/** |
||||
* 当Item被长按的时候是否可以被拖拽 |
||||
*/ |
||||
override fun isLongPressDragEnabled(): Boolean { |
||||
return isCanDrag |
||||
} |
||||
|
||||
/** |
||||
* Item是否可以被滑动(H:左右滑动,V:上下滑动) |
||||
*/ |
||||
override fun isItemViewSwipeEnabled(): Boolean { |
||||
return isCanSwipe |
||||
} |
||||
|
||||
/** |
||||
* 当用户拖拽或者滑动Item的时候需要我们告诉系统滑动或者拖拽的方向 |
||||
*/ |
||||
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { |
||||
val layoutManager = recyclerView.layoutManager |
||||
if (layoutManager is GridLayoutManager) {// GridLayoutManager |
||||
// flag如果值是0,相当于这个功能被关闭 |
||||
val dragFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN |
||||
val swipeFlag = 0 |
||||
// create make |
||||
return makeMovementFlags(dragFlag, swipeFlag) |
||||
} else if (layoutManager is LinearLayoutManager) {// linearLayoutManager |
||||
val linearLayoutManager = layoutManager as LinearLayoutManager? |
||||
val orientation = linearLayoutManager!!.orientation |
||||
|
||||
var dragFlag = 0 |
||||
var swipeFlag = 0 |
||||
|
||||
// 为了方便理解,相当于分为横着的ListView和竖着的ListView |
||||
if (orientation == LinearLayoutManager.HORIZONTAL) {// 如果是横向的布局 |
||||
swipeFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN |
||||
dragFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT |
||||
} else if (orientation == LinearLayoutManager.VERTICAL) {// 如果是竖向的布局,相当于ListView |
||||
dragFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN |
||||
swipeFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT |
||||
} |
||||
return makeMovementFlags(dragFlag, swipeFlag) |
||||
} |
||||
return 0 |
||||
} |
||||
|
||||
/** |
||||
* 当Item被拖拽的时候被回调 |
||||
* |
||||
* @param recyclerView recyclerView |
||||
* @param srcViewHolder 拖拽的ViewHolder |
||||
* @param targetViewHolder 目的地的viewHolder |
||||
*/ |
||||
override fun onMove( |
||||
recyclerView: RecyclerView, |
||||
srcViewHolder: RecyclerView.ViewHolder, |
||||
targetViewHolder: RecyclerView.ViewHolder |
||||
): Boolean { |
||||
onItemTouchCallbackListener?.let { |
||||
return it.onMove(srcViewHolder.adapterPosition, targetViewHolder.adapterPosition) |
||||
} |
||||
return false |
||||
} |
||||
|
||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { |
||||
onItemTouchCallbackListener?.let { |
||||
return it.onSwiped(viewHolder.adapterPosition) |
||||
} |
||||
} |
||||
|
||||
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { |
||||
super.onSelectedChanged(viewHolder, actionState) |
||||
val swiping = actionState == ItemTouchHelper.ACTION_STATE_DRAG |
||||
swipeRefreshLayout?.isEnabled = !swiping |
||||
viewPager?.requestDisallowInterceptTouchEvent(swiping) |
||||
} |
||||
|
||||
interface OnItemTouchCallbackListener { |
||||
/** |
||||
* 当某个Item被滑动删除的时候 |
||||
* |
||||
* @param adapterPosition item的position |
||||
*/ |
||||
fun onSwiped(adapterPosition: Int) |
||||
|
||||
/** |
||||
* 当两个Item位置互换的时候被回调 |
||||
* |
||||
* @param srcPosition 拖拽的item的position |
||||
* @param targetPosition 目的地的Item的position |
||||
* @return 开发者处理了操作应该返回true,开发者没有处理就返回false |
||||
*/ |
||||
fun onMove(srcPosition: Int, targetPosition: Int): Boolean |
||||
} |
||||
} |
Loading…
Reference in new issue