【问题标题】:Android - ListView first visible position not updatingAndroid - ListView 第一个可见位置未更新
【发布时间】:2013-05-24 10:54:11
【问题描述】:

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

有什么想法吗?

干杯

【问题讨论】:

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


    【解决方案1】:

    也许你应该试着打电话:

    listView.smoothScrollToPosition(yourPosition);
    

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

    【讨论】:

    • 对不起,我的意思是说这已经回答了 - 无论如何都干杯
    【解决方案2】:

    解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      相关资源
      最近更新 更多