在onCreate()中如果简单地通过setSelection(position)指定ListView的显示项,由于View还没有创建,因此实际无效。
通常的做法是通过post()来延迟执行,如代码所示:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = getListView(); //get desired item position of the listView position = ... // other operations BaseAdapter adapter = ...; // get the adapter and listView.setAdapter(adapter); listView.post(new Runnable() { public void run() { listView.setSelection(position); } }); }
但结果是ListView先显示出来,然后好像被点击了一下以后滚动到期望位置。经过尝试,发现要改进其实是非常简单的,只要通过Adapter invalidate ListView即可:
// listView.post(new Runnable() // { // public void run() // { // listView.setSelection(position); // } // }); listView.setSelection(position); adapter.notifyDataSetChanged();
UI呈现前ListView就应该重新定位,结果就是ListActivity会直接呈现期待的条目。