Xamarin.Android Attach Fab Button to RecyclerView

Viewed 546

i'm working on C# Xamarin.Android

GITHUB - jamesmontemagno/FloatingActionButton-for-Xamarin.Android

this library is now deprecated, and i don't find how to attach my fab button to recyclerview: when is scroll up or down i want that the fab button appears and disappears..

This is how github code was. But today is not working

var listView = FindViewById<ListView>(Android.Resource.Id.list);
var fab = FindViewById<FloatingActionButton>(Resource.Id.fab);
fab.AttachToListView(listView);

My XML:

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh"
        android:layout_width="match_parent"
        android:layout_marginTop="100dp"
        android:layout_height="match_parent"
        android:layout_below="@+id/buildpizzaingredienti_toolbar">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/buildpizzaingredienti_cmListView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </android.support.v4.widget.SwipeRefreshLayout>
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="16dp"
        android:src="@drawable/ic_next"
        app:backgroundTint="#4A8E53" />
2 Answers

Update based on a newer version:

public class FabBehavior : CoordinatorLayout.Behavior
{
    public FabBehavior()
    {

    }

    public FabBehavior(Context context, IAttributeSet attrs) : base(context, attrs)
    {
    }

    public override void OnNestedScroll(CoordinatorLayout coordinatorLayout, Object child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed,
        int dyUnconsumed, int type)
    {
        base.OnNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type);

        var fab = child.JavaCast<FloatingActionButton>();
        if (fab.Visibility == ViewStates.Visible && dyConsumed > 0)
        {
            fab.Hide(new VisibilityListener());
        }
        else if (fab.Visibility == ViewStates.Invisible && dyConsumed < 0)
        {
            fab.Show();
        }
    }

    public override bool OnStartNestedScroll(CoordinatorLayout coordinatorLayout, Object child, View directTargetChild, View target, int axes, int type)
    {
        return axes == ViewCompat.ScrollAxisVertical;
    }
}

public class VisibilityListener : FloatingActionButton.OnVisibilityChangedListener
{
    public override void OnHidden(FloatingActionButton fab)
    {
        base.OnHidden(fab);

        fab.Visibility = ViewStates.Invisible;
    }
}

Update:

I don't know why, but this class works:

FabBehavior : CoordinatorLayout.Behavior

Because Hide() set ViewStates.Gone to fab and ConstraintLayout not see anymore this button. Sad

Need to change Gone to Invisible

if (fab.Visibility == ViewStates.Invisible && dyConsumed < 0)

Need to add VisivilityListener for hidden action. Inside it's set Invisible instead Gone

fab.Hide(new VisibilityListener());

Related