ListView.getLastVisiblePosition()返回-1

时间:2014-11-18 17:18:55

标签: android

我在ListView中有一个自定义Activity,它会显示所有内容。但是,我希望它在列表视图的中间显示一个选定的行。为此,我有以下代码。值得一提的是,此初始调用位于onPostExecute()的{​​{1}}中调用的AsyncTask的{​​{1}}。

onCreate()

代码运行时,这些是以下值:

  • Activity = some int(例如16)
  • ListView lv = (ListView)a.findViewById(R.id.my_layout); lv.setAdapter(adapter); int rowsOnScreen = Math.abs(lv.getLastVisiblePosition() - lv.getFirstVisiblePosition()); int rowToStartOn = myRow - rowsOnScreen / 2; if(rowToStartOn < 0) rowToStartOn = 0; if(rowToStartOn > lv.getCount()) rowToStartOn = lv.getCount(); lv.setSelection(rowToStartOn); = -1
  • myRow = 0
  • lv.getLastVisiblePosition() = 39(或其他一些int)

现在让我说在向用户显示所有内容后,我会调用这些行(虽然按下按钮)

lv.getFirstVisiblePosition()

然后代码有效,我得到的lv.getCount()值不是int rowsOnScreen = Math.abs(lv.getLastVisiblePosition() - lv.getFirstVisiblePosition()); int rowToStartOn = leaderBoard.myRank.rank - rowsOnScreen / 2; if(rowToStartOn < 0) rowToStartOn = 0; if(rowToStartOn > lv.getCount()) rowToStartOn = lv.getCount(); lv.setSelection(rowToStartOn); 。所以,我在getLastVisiblePosition()建立-1后第一次调用它时,我所计算的getLastVisiblePosition()还没有被计算出来。那么我的主要问题是,如何在不需要用户交互的情况下在第一次运行时获得该值?

1 个答案:

答案 0 :(得分:2)

将您的计算作为runnable发布到ListView的消息队列的后面:

final ListView lv = (ListView)a.findViewById(R.id.my_layout);
lv.setAdapter(adapter);

lv.post(new Runnable() {
    @Override
    public void run() {
        int rowsOnScreen =  Math.abs(lv.getLastVisiblePosition() - lv.getFirstVisiblePosition());
        int rowToStartOn = myRow - rowsOnScreen / 2;

        if(rowToStartOn < 0) rowToStartOn = 0;
        if(rowToStartOn > lv.getCount()) rowToStartOn = lv.getCount();

        lv.setSelection(rowToStartOn);
    }
});