FloatingActionButton+RecycleView联动,并解决只隐藏不出现的bug

xiaoxiao2021-02-28  119

实现效果为向下滑动FAB消失,向上滑动FAB出现,点击FAB自动跳转到Recycleview顶部。

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.mark_pc.yixuedemo.fragment.HomeFragment"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrv_classify" android:layout_width="match_parent" android:layout_height="match_parent"> </com.jcodecraeer.xrecyclerview.XRecyclerView> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_mian" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_marginBottom="20dp" android:layout_marginRight="15dp" android:src="@drawable/icon_wancheng_me" android:visibility="invisible" app:backgroundTint="#efefef" app:rippleColor="#33728dff" app:layout_behavior="com.example.mark_pc.yixuedemo.view.ScrollAwareFABBehaviorDefault"/> </android.support.design.widget.CoordinatorLayout>

RecycleView是通过通知CoordinatorLayout来联动FAB的,所以父布局必须用到CoordinatorLayout

app:layout_behavior="com.example.mark_pc.yixuedemo.view.ScrollAwareFABBehaviorDefault"

然后自定义一个behavior

package com.example.mark_pc.yixuedemo.view; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; /** * Created by Mark-PC on 2017/6/6. */ public class ScrollAwareFABBehaviorDefault extends FloatingActionButton.Behavior { public ScrollAwareFABBehaviorDefault(Context context, AttributeSet attrs) { super(); } @Override public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, final View directTargetChild, final View target, final int nestedScrollAxes) { // Ensure we react to vertical scrolling return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, final View target, final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { child.hide(); } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { child.show(); } } }

再给FAB设置一个点击事件,这样就实现最终效果了

case R.id.fab_mian: //点击跳转到顶部,并隐藏FAB xrv_classify.smoothScrollToPosition(0); fab_mian.setVisibility(View.INVISIBLE); break;

有时候会出现只能隐藏,不能出现的bug,主要是因为SDK的版本问题,25.1.1及以上都不行,把design的版本换成25.0.1就可以了

还有一种说法,是因为在25SDK中CoordinatorLayout的onNestedScroll()这个方法中for循环里面添加了一个判断 if (view.getVisibility() == GONE) { // If the child is GONE, skip...     continue; } 如果直接使用hide()方法或者直接设置View的状态为GONE的画,都会是该条件判断成立,从而跳出for循环,后面Behavior就没法响应事件了

转载请注明原文地址: https://www.6miu.com/read-32910.html

最新回复(0)