1

所以我有一个 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);
}   

有任何想法吗?

干杯

4

2 回答 2

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 中有不同大小的项目,因此这种方式似乎是最简单的方法。

于 2013-07-18T14:47:21.003 回答
0

也许您应该尝试致电:

listView.smoothScrollToPosition(yourPosition);

另一种方法是手动设置项目的滚动,但第一种方法应该适合你。

于 2013-07-18T11:57:13.110 回答