【问题标题】:Button not disappearing with setVisibility(View.GONE)按钮不随 setVisibility(View.GONE) 消失
【发布时间】:2018-09-11 15:32:37
【问题描述】:

我在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),但即使在滚动完成后仍会显示该按钮。

【问题讨论】:

  • 从 XML 中删除可见性并重试
  • @AkshayRohilla 试过了。没用。

标签: android android-recyclerview visibility android-button


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个,我也推荐你在这里使用浮动操作按钮。我创建了一个简单的项目,以防你想看看带有 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();
               }
    
        }
    });
    

    【讨论】:

    • 在滚动上显示和隐藏按钮的逻辑工作正常。当滚动位置完成时,隐藏按钮不起作用。我指的是按钮的 onClick() 方法。
    【解决方案3】:
     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 方法。

    【讨论】:

    • 嗨。我试过这段代码。它没有用。滚动到顶部完成后,该按钮仍然可见。
    • 您可能遗漏了什么,您是否更改了 onScrolled 方法代码?
    • 是的。我添加了与您发布的完全相同的代码 sn-p,包括 onScrolled 方法。
    • 感谢上传代码。我经历了它并调整了我的代码以匹配它。问题是它仍然不起作用。我认为 smoothScrollToPosition() 使 dy
    【解决方案4】:

    这是我解决它的方法。改变 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);
                }
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 2013-04-17
      • 2020-10-31
      • 1970-01-01
      • 2016-03-31
      • 2013-11-28
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多