Поведение FAB предотвращает нажатие на элементы RecyclerView - PullRequest
1 голос
/ 23 марта 2020

У меня есть RecyclerView внутри CoordinatorLayout вместе с FAB:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <TextView
        android:id="@+id/empty"
        android:visibility="invisible"
        android:textSize="@dimen/title"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin"
        android:src="@drawable/add"
        android:layout_gravity="bottom|right"
        app:fabSize="normal"
        app:tint="@android:color/white" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

При прикреплении поведения к FAB вот так:

(fab.layoutParams as CoordinatorLayout.LayoutParams).behavior = ScrollAwareFABBehavior()

Затем first click Событие не отправляется в представления элементов. Слушатели щелчка (ViewHolder.itemView.setOnClickListener()), когда FAB скрыт. Вот реализация поведения:

class ScrollAwareFABBehavior : FloatingActionButton.Behavior() {

    override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
        return axes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
    }

    override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int, consumed: IntArray) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed)
        if (dyConsumed > 0) {
            child.hide(object : OnVisibilityChangedListener() {
                override fun onHidden(fab: FloatingActionButton) {
                    super.onHidden(fab)
                    fab.visibility = View.INVISIBLE
                }
            })
        } else if (dyConsumed < 0) {
            child.show()
        }
    }
}

вызывается OnStartNestedScroll, но не слушатель щелчка элемента, если я действительно не стараюсь не прокручивать экран с 1px при щелчке элемента вторичной переработки.

Все работает как положено, когда:

  1. удаление поведения из FAB
  2. удаление OnVisibilityChangedListener из реализации поведения
  3. или удаление только fab.visibility = View.INVISIBLE из поведения impl

Но без fab.visibility = View.INVISIBLE FAB больше не появляется после того, как был скрыт FabBehaviour ( FAB Скрывает, но не показывает ) ...

Если кто-то может помочь мне показать / скрыть FAB с использованием поведения и не иметь первого клика, не доставленного на просмотр предмета, было бы здорово!

1 Ответ

0 голосов
/ 23 марта 2020

Использование RecyclerView.OnScrollListener помогло мне решить эту проблему более простым способом:

// (fab.layoutParams as CoordinatorLayout.LayoutParams).behavior = ScrollAwareFABBehavior()
recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() {
    var scrolling : Boolean = false
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        if (!scrolling) return
        if (dy > 0) {
            fab.hide()
        } else {
            fab.show()
        }
    }
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        scrolling = newState == RecyclerView.SCROLL_STATE_DRAGGING
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...