how to show/hide FAB on scroll Recycler view with coordinator parent

前端 未结 5 854
轻奢々
轻奢々 2021-02-04 11:41

I have an activity with coordinator layout.inside activity there is a fragment with Recycler view and float button.how can I show/hide float button when Scroll Recycler view and

相关标签:
5条回答
  • 2021-02-04 12:06

    This code works just fine:

     mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        if(dy > 0){
                            mFab.hide();
                        } else{
                            mFab.show();
                        }
    
                        super.onScrolled(recyclerView, dx, dy);
                    }
                });
    

    You cannot do:

    app:layout_anchor="@id/listView"
    app:layout_anchorGravity="bottom|end"
    

    Look here:

    There is no support built-in for CoordinatorLayout to work with ListView according to this Google post.

    0 讨论(0)
  • 2021-02-04 12:12

    Solution in Kotlin

    recycler_view = findViewById(R.id.recycler_view)
    
            recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener(){
                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                    if(dy > 0){
                        fab.hide();
                    } else{
                        fab.show();
                    }
                    super.onScrolled(recyclerView, dx, dy)
    
                }
            })
    
    0 讨论(0)
  • 2021-02-04 12:15

    Here is working solution:

    class HideOnScrollFabBehavior(context: Context?, attrs: AttributeSet?) : FloatingActionButton.Behavior() {
    
        // changes visibility from GONE to INVISIBLE when fab is hidden because
        // due to CoordinatorLayout.onStartNestedScroll() implementation
        // child view's (here, fab) onStartNestedScroll won't be called anymore
        // because it's visibility is GONE
        private val listener = object : FloatingActionButton.OnVisibilityChangedListener() {
            override fun onHidden(fab: FloatingActionButton?) {
                fab?.visibility = INVISIBLE
            }
        }
    
        override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
            return axes == ViewCompat.SCROLL_AXIS_VERTICAL // Ensure we react to vertical scrolling
                    || 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 (!target.canScrollVertically(1) && dyConsumed > 0 && child.visibility == VISIBLE) {
                // hide the FAB when scroll view reached its bottom
                child.hide(listener)
            } else if (dyConsumed < 0 && child.visibility != VISIBLE) {
                // show the FAB on scroll up
                child.show()
            }
        }
    
    }
    
    0 讨论(0)
  • 2021-02-04 12:21

    add this to FAB :

    app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"

    0 讨论(0)
  • 2021-02-04 12:22

    I modified Leondro's method such that the FAB will hide when there's scrolling and show when the scrolling stops.

    scrollListener = new RecyclerView.OnScrollListener() {  
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            switch (newState) {
                case RecyclerView.SCROLL_STATE_IDLE:
                    fab.show();
                    break;
                default:
                    fab.hide();
                    break;
            }
            super.onScrollStateChanged(recyclerView, newState);
        }
    }; 
    
    rv.clearOnScrollListeners();
    rv.addOnScrollListener(scrollListener);
    
    0 讨论(0)
提交回复
热议问题