Android - ListView第一个可见位置未更新

时间:2013-05-24 10:54:12

标签: android android-listview android-adapterview android-scroll

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

有什么想法吗?

干杯

2 个答案:

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

相关问题