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

来源:互联网 发布:naza飞控调参软件下载 编辑:程序博客网 时间:2024/06/05 17:47

实现效果为向下滑动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就没法响应事件了




阅读全文
0 0
原创粉丝点击