我在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()
还没有被计算出来。那么我的主要问题是,如何在不需要用户交互的情况下在第一次运行时获得该值?
答案 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);
}
});