Интересно, как мне добиться такого поведения RecyclerView
, чтобы я мог прокручивать список только тогда, когда я щелкаю и перетаскиваю только определенный вид в пределах ViewHolder
?
Я отключил горизонтальную прокруткусоздав свой собственный LinearLayoutManager:
class MyOwnLayoutManager : LinearLayoutManager {
constructor(context: Context?) : super(context)
constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
private var isScrollEnabled = false
fun setScrollEnabled(isEnabled: Boolean) {
isScrollEnabled = isEnabled
}
override fun canScrollVertically(): Boolean {
return isScrollEnabled && super.canScrollVertically()
}
override fun canScrollHorizontally(): Boolean {
return isScrollEnabled && super.canScrollHorizontally()
}
}
Затем я пытаюсь изменить isScrollEnabled
, установив для слушателя касания заголовок элемента:
item_header.setOnTouchListener { v, event ->
val isScrolling = event.action == ACTION_MOVE
onHeaderIsDragging.invoke(isScrolling)
false
}
Обратный вызов во фрагменте, который изменяетсяменеджер компоновки адаптеров var:
private val onHeaderIsDragging: ((Boolean) -> Unit) = {
recyclerViewLayoutManager.setScrollEnabled(it)
}
В этой реализации MOTION_CANCEL
после пары событий MOTION_MOVE
в onTouchListener
и RecyclerView
не прокручивается после событий MOTION_MOVE
.