У меня есть RecyclerView с пользовательским LayoutManager, который имеет двустороннюю логику прокрутки c. Итак, я переопределил его методы:
override fun canScrollVertically(): Boolean = true
override fun canScrollHorizontally(): Boolean = true
Затем я поместил RecyclerView в пользовательский SwipeRefreshLayout, , чтобы предотвратить действие «swipe to refre sh», когда пользователь прокручивает мой список по горизонтали :
class CustomSwipeToRefresh
@JvmOverloads
constructor(
context: Context,
attrs: AttributeSet? = null
) : SwipeRefreshLayout(context, attrs) {
private val touchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop
private var startX = 0f
private var forbidSwipe = false
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
ACTION_DOWN -> startX = event.x
ACTION_MOVE -> {
if (abs(event.x - startX) > touchSlop || forbidSwipe) {
forbidSwipe = true
return false
}
}
ACTION_CANCEL, ACTION_UP -> {
forbidSwipe = false
}
}
return super.onInterceptTouchEvent(event)
}
}
Но это решение не работает. Пробовал это решение (отключение вручную), но оно тоже не работает:
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
ACTION_DOWN -> startX = event.x
ACTION_MOVE -> {
if (abs(event.x - startX) > touchSlop || forbidSwipe) {
forbidSwipe = true
isEnabled = false
return false
}
}
ACTION_CANCEL, ACTION_UP -> {
isEnabled = true
forbidSwipe = false
}
}
return super.onInterceptTouchEvent(event)
}
В любом случае, если я напишу
refreshLayout.isEnabled = false
в моем onViewCreated во Fragment, оно станет отключенным.
Также попытался отключить SwipeRefreshLayout в RecyclerView.OnScrollListener, но это не помогло. Что не так в моем коде или SwipeRefreshLayout?