按钮不会随 setVisibility(View.GONE) 消失

Button not disappearing with setVisibility(View.GONE)

我在 RecyclerView 上向上滚动时显示转到顶部按钮。如果用户向上滚动,则会显示该按钮。

这是嵌套在 RelativeLayout 中的 xml 代码。

<android.support.v7.widget.RecyclerView
    android:id="@+id/userFeedsRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<Button
    android:id="@+id/btn_goto_top"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:text="@string/icon_up_arrow"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="20dp"
    android:visibility="gone"
    android:textSize="10sp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/round_button"/>

这是java代码

btnGotoTop = (Button) findViewById(R.id.btn_goto_top);
    Const.setTypeFace(btnGotoTop, getApplication());
    btnGotoTop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            userFeedsRecyclerView.smoothScrollToPosition(0);
            view.setVisibility(View.GONE);
        }
    });


    userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if(dy < 0){
                btnGotoTop.setVisibility(View.VISIBLE);
            }
            else{
                btnGotoTop.setVisibility(View.GONE);
            }
        }
    });

btnGotoToponClick() 方法中,RecyclerView 正确滚动到顶部但按钮没有消失。 我尝试将 view.setVisibility(View.GONE) 更改为 btnGotoTop.setVisibility(View.GONE),但即使在滚动完成后仍会显示该按钮。

你的条件不对。您正在使按钮在滚动时可见,但您只想在它按下时显示。 改变这个

if(dy < 0){
            btnGotoTop.setVisibility(View.VISIBLE);
        }
        else{
            btnGotoTop.setVisibility(View.GONE);
        }

if(dy > 0){
            btnGotoTop.setVisibility(View.VISIBLE);
        }
        else{
            btnGotoTop.setVisibility(View.GONE);
        }

试试这个,我也推荐你在这里使用浮动操作按钮。我创建了一个简单的项目,以防您想使用具有相同功能的 FloatingActionButton 查找 recylerView。 Link.

    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
           if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE) 
           {
                    btnGotoTop.hide();

           } else if (dy < 0 && btnGotoTop.getVisibility() != View.VISIBLE) 
           {
                    btnGotoTop.show();
           }

    }
});
 private boolean IsRecyclerViewAtTop(){
    if (userFeedsRecyclerView.getChildCount() == 0)
        return true;
    return userFeedsRecyclerView.getChildAt(0).getTop() == 0;
}


userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (IsRecyclerViewAtTop())
                {
                    btnGotoTop.setVisibility(View.GONE);
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy < 0 && btnGotoTop.getVisibility()==View.GONE) {
                    btnGotoTop.setVisibility(View.VISIBLE);
                } else if (dy > 0 && btnGotoTop.getVisibility()==View.VISIBLE){

                    btnGotoTop.setVisibility(View.GONE);
                }
            }
        });

使用IsRecyclerViewAtTop方法判断回收器视图是否滚动到顶部并调用它是onScrollStateChanged方法。

我是这样解决的。更改了 RecyclerView 的 OnScrollListener

的 onScrollStateChanged() 中按钮的可见性
btnGotoTop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            userFeedsRecyclerView.smoothScrollToPosition(0);
            view.setVisibility(View.GONE);
            headerAppBarLayout.setExpanded(true);
        }
    });

private boolean isUserFeedRecyclerViewAtTop(){

    int numColumns = 2;
    int pos[] = new int[numColumns];
    ((StaggeredGridLayoutManager)(userFeedsRecyclerView.getLayoutManager())).findFirstCompletelyVisibleItemPositions(pos);
    return pos[0] == 0;
}

userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            switch (newState){
                case RecyclerView.SCROLL_STATE_IDLE:
                    if(isUserFeedRecyclerViewAtTop()) {
                        btnGotoTop.setVisibility(View.GONE);
                    }
                    break;
                case RecyclerView.SCROLL_STATE_DRAGGING:
                    break;
                case RecyclerView.SCROLL_STATE_SETTLING:
                    break;
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            if(dy < 0 && btnGotoTop.getVisibility() == View.GONE){
                btnGotoTop.setVisibility(View.VISIBLE);
            }
            else if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE){
                btnGotoTop.setVisibility(View.GONE);
            }
        }
    });