在 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 中向上滚动时显示元素 - 视差效果
向下滚动时隐藏导航栏并在用户使用 jquery 向上滚动页面时显示它,不能正常工作