在 ListView 上向上滚动时显示 ActionBar

Posted

技术标签:

【中文标题】在 ListView 上向上滚动时显示 ActionBar【英文标题】:Show the ActionBar while scrolling up on a ListView 【发布时间】:2014-10-22 08:11:36 【问题描述】:

我有一个ListView,当我向下或向上滚动时,我可以使用此解决方案检测到这一点:

listView.setOnScrollListener(new OnScrollListener() 
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState)  

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) 

        if(listView.getFirstVisiblePosition() == 0)
            getActionBar().show();
        else
            getActionBar().hide();
    
);

这种方式有效,ActionBar 会在滚动返回到列表的第一项时显示。当我开始在列表中向上滚动时,我还想再次显示ActionBar

编辑:

这是最后一种方法,它并不总是有效.. 有时操作栏会消失并且永远不会回来:

private int mPreviousFirst;
...
listView.setOnScrollListener(new OnScrollListener() 
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState)  

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) 
      if(prevVisibleItem != firstVisibleItem)
        if (firstVisibleItem < mPreviousFirst) 
            getActionBar().show();
         else 
            getActionBar().hide();

        mPreviousFirst = firstVisibleItem;
      
    
);

我很接近但出了点问题:(

【问题讨论】:

你能评论你的帖子吗?我认为缺少一些信息,这些情况使您难以理解您的问题。 【参考方案1】:

您可以通过在每次更改时保存之前的第一个可见位置来做到这一点:

private int mPreviousFirst;
...
listView.setOnScrollListener(new OnScrollListener() 
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState)  

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) 

        if (firstVisibleItem < mPreviousFirst) 
            getActionBar().show();
         else if (firstVisibleItem > mPreviousFirst) 
            getActionBar().hide();
        
        mPreviousFirst = firstVisibleItem;

    
);

【讨论】:

mmh.. 现在它会随心所欲地出现和消失:) @End.Game 我已经更新了我的答案,之前是错误的。但是请注意,这不是最好的方法。 @End.Game 对我来说很好,它看起来不太好。但是它有效。只是不要启用快速滚动,因为它有时会跳跃,这会导致您的操作栏切换。 是的,它有效,问题似乎,正如你所说,快速滚动.. 删除它是个好主意吗? @End.Game 它只是出现在右侧(默认情况下)的手动滚动条,您可以使用它来快速滚动一长串列表。我相信它默认是禁用的。【参考方案2】:

您可以尝试在视图中操作以下 onScrollChanged,

onScrollChanged

它跟踪滚动的当前和以前的状态。如果你要上升,那么你可以做同样的行为。

类似于以下内容的内容可以实现您的要求:

@Override
protected void onScrollChanged (int currentHorizontalPosition, int currentVerticalPosition, int oldHorizontalPosition, int oldVerticalPosition)

   if(currentVerticalPosition < oldVerticalPosition && positionDifference > threshold)
   
       getActionBar().show();
   
   else //condition for downscroll or other actions.
   
       getActionBar().hide();
   

【讨论】:

【参考方案3】:
   mListView.setOnScrollListener(new AbsListView.OnScrollListener() 
        int mLastFirstVisibleItem = 0;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState)    

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
            if (view.getId() == mListView.getId()) 
                final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();

                if (currentFirstVisibleItem > mLastFirstVisibleItem) 
                    // getSherlockActivity().getSupportActionBar().hide();
                    activity.hideActionBar();
                 else if (currentFirstVisibleItem < mLastFirstVisibleItem) 
                    // getSherlockActivity().getSupportActionBar().show();
                    activity.showActionBar();
                

                mLastFirstVisibleItem = currentFirstVisibleItem;
            
        
    );

这在 kitkat 上对我有用

【讨论】:

以上是关于在 ListView 上向上滚动时显示 ActionBar的主要内容,如果未能解决你的问题,请参考以下文章

Nativescript 在 ListView 中向上滚动时显示元素 - 视差效果

向下滚动ListView时显示按钮

向下滚动时隐藏标题,向上滚动时显示

向下滚动时隐藏导航栏并在用户使用 jquery 向上滚动页面时显示它,不能正常工作

Android:向上滚动时显示工具栏(向上拖动),向下滚动时隐藏(向下拖动)

过度滚动时显示标题的Android Listview