Android getLastVisiblePosition()返回-1

Android getLastVisiblePosition()返回-1,android,Android,我在活动中有一个自定义的列表视图,它显示了它应该显示的所有内容。但是,我希望它在列表视图中间显示一个选定行。为此,我有以下代码。值得一提的是,此初始调用位于活动的onCreate()中调用的AsyncTask的onPostExecute()中 ListView lv = (ListView)a.findViewById(R.id.my_layout); lv.setAdapter(adapter); int rowsOnScreen = Math.abs(lv.getLastVisibleP

我在
活动
中有一个自定义的
列表视图
,它显示了它应该显示的所有内容。但是,我希望它在列表视图中间显示一个选定行。为此,我有以下代码。值得一提的是,此初始调用位于
活动的
onCreate()
中调用的
AsyncTask
onPostExecute()

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);

然后代码开始工作,我得到一个
getLastVisiblePosition()
的值,它不是
-1
。所以,我想的是,当我在构建我的
列表视图之后第一次调用它时,
getLastVisiblePosition()
还没有计算出来。那么,我的主要问题是,如何在不需要用户交互的情况下在第一次运行时获得该值

将您的计算作为可运行项发布到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);
    }
});
final ListView lv=(ListView)a.findViewById(R.id.my_布局);
低压设置适配器(适配器);
lv.post(新可运行(){
@凌驾
公开募捐{
int rowsOnScreen=Math.abs(lv.getLastVisiblePosition()-lv.getFirstVisiblePosition());
int rowToStartOn=myRow-rowsOnScreen/2;
如果(rowToStartOn<0)rowToStartOn=0;
如果(rowToStartOn>lv.getCount())rowToStartOn=lv.getCount();
lv.选举(rowToStartOn);
}
});
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);
    }
});