所以我有一个ListView以及上下按钮。
我的目标是每当我按下其中一个按钮,简单的向上/向下导航时,按照它的高度滚动ListView。
滚动确实有效。当我按下时,ListView每次滚动时都会滚动正确的距离。
但是,只有向上按钮按预期工作。向下按钮有问题,我认为是由于 ListView的第一个可见滚动位置没有更新。
当我按下时,onNavigationDownPressed()方法如下所示。这将在ListView中向下滚动正确的数量,并且起始ListView firstVisiblePosition为0.下次调用该方法时,第一个可见位置仍为0 。
但是,如果我手动向下滚动ListView然后向下按,它会正确向下滚动然后同样的事情,由于firstVisiblePostion没有改变,它不会再下降,除非我先滚动以使职位更新。
// Scroll up
@Override
public void onNavigationUpPressed()
{
Log.i("MAKE UP, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));
listView.setSelectionFromTop(listView.getFirstVisiblePosition(), fragmentHeight);
}
// Scroll down
@Override
public void onNavigationDownPressed()
{
Log.i("MAKE DOWN, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));
listView.setSelectionFromTop(listView.getFirstVisiblePosition(), -fragmentHeight);
}
有什么想法吗?
干杯
答案 0 :(得分:0)
也许您应该尝试致电:
listView.smoothScrollToPosition(yourPosition);
另一种方法是手动设置项目的滚动,但第一种方法应该适合你。
答案 1 :(得分:0)
<强>解决方案:强>
我为ListView设置了一个onScrollListener,它在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)
{
Log.i("MMY: ", "Scroll");
Log.i("MMY: ", "First visible item: " + String.valueOf(firstVisibleItem));
Log.i("MMY: ", "Visible item count: " + String.valueOf(visibleItemCount));
// The variables that belong to this class now equal ->
General_Navigation_Fragment.this.visibleItemCount = visibleItemCount;
General_Navigation_Fragment.this.firstVisibleItem = firstVisibleItem;
totalCount = totalItemCount;
}
});
当按下向下按钮时,我得到了第一个可见项目的索引,我得到了屏幕上可见项目的数量(n),然后向下滚动到当前位置+ n。只需反向滚动即可。
// Scroll up
@Override
public void onNavigationUpPressed()
{
currentVisibleItem = firstVisibleItem - visibleItemCount;
if (currentVisibleItem < 0)
{
listView.setSelection(0);
}
else
listView.setSelection(currentVisibleItem - 1);
}
// Scroll down
@Override
public void onNavigationDownPressed()
{
currentVisibleItem = visibleItemCount + firstVisibleItem;
listView.setSelection(currentVisibleItem - 1);
}
由于我的ListView中有不同大小的项目,这种方式似乎是最简单的方法。