【发布时间】:2020-01-09 15:23:58
【问题描述】:
设置:我有一个RecyclerView 和一个vertical LinearLayoutManager。每个ViewHolder有2个TextViews(图中绿色和红色),可以很长。由于HorizontalScrollView,RED 可以水平滚动。由于ScrollView,GREEN 可以垂直滚动。
现在我实现了ItemTouchHelper,可以向左、向上或向下滑动。问题是我的ScrollViews 不再工作了。相反,即使我向上或向下滑动GREEN,移动的是我的ViewHolder。 如何防止我的ItemTouchHelper 获得触摸事件?
我试过了:
-android:descendantFocusability="blocksDescendants"
-NestedScrollView 而不是ScrollView
-在我的适配器内部实现setOnTouchListener以返回true(监听器被触发,但事件未被消费)
-考虑在onChildDraw 中使用RecyclerView.findChildViewUnder 手动滚动并阻止super 方法,但我找不到获取坐标的方法
到目前为止没有任何效果。我该怎么做呢?这是我的ItemTouchHelper:
private fun enableSwipe() {
val simpleItemTouchCallback =
object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.adapterPosition
if (direction == ItemTouchHelper.LEFT) {
val content = mAdapter.getContentForPosition(position)
//do stuff...
}
}
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
val mdX = if (abs(dY) > abs(dX)) {
0f
}else{
dX
}
val mdY = if (abs(dY) > abs(dX)) {
when{
dY > 0 -> if (dY > 500f) 500f else dY
else -> if (dY < -500f) -500f else dY
}
}else{
0f
}
//override viewHolder in case we swipe up or down on the other content
val mViewHolder: RecyclerView.ViewHolder = if (abs(dY) > abs(dX)) {
if (dY < 0) {
//swiping up
getViewHolder(1) ?: viewHolder
} else {
getViewHolder(0) ?: viewHolder
}
}else {
viewHolder
}
super.onChildDraw(c, recyclerView, mViewHolder, mdX, mdY, actionState, isCurrentlyActive)
}
}
val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback)
itemTouchHelper.attachToRecyclerView(recyclerViewClash)
}
【问题讨论】:
标签: android scrollview itemtouchhelper