FAB行为可防止单击RecyclerView项

问题描述 投票:1回答:1

我在CoordinatorLayout和FAB中都有一个RecyclerView:

<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()
隐藏FAB时,

Then first click事件不会调度到项目视图单击侦听器(ViewHolder.itemView.setOnClickListener())。这是行为实现:

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被调用但not该项目单击了侦听器,除非我真的很小心在单击回收器项目时不要从1px滚动屏幕。

一切正常:]

  1. 从FAB删除行为
  2. 从行为实现中删除OnVisibilityChangedListener
  3. 或仅从行为暗示中删除fab.visibility = View.INVISIBLE
  4. 但是如果没有fab.visibility = View.INVISIBLE,FAB在被FabBehaviour(F.A.B Hides but Doesn't Show)隐藏之后再也不会显示。

如果有人可以通过行为帮助我显示/隐藏FAB,并且没有将第一次单击未传递到项目视图,那就太好了!

我在CoordinatorLayout和FAB中都有一个RecyclerView:] >

android android-recyclerview floating-action-button
1个回答
0
投票
// (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 } })
© www.soinside.com 2019 - 2024. All rights reserved.