这里只写一种方法,直接利用Google推荐的方法。 举个例子就是: 做一个文件管理器,当进入子目录,然后返回后仍然能准确恢复之前的位置;具体方法就是 获取第一个可见的item的位置,再获取这个item对应view距离顶端的距离,然后调用listview.setSelectionFromTop(index,top); 即可。 下面是例子的部分代码 private List<int[][]> stringsX_Y;//用来记录index 和 top; private View.OnClickListener onBackClickListener=new View.OnClickListener() {//返回上文件目录后调用listView_fileList.setSelectionFromTop(); ...................... listView_fileList.setSelectionFromTop(stringsX_Y.get(stringsX_Y.size()-1)[0][0], stringsX_Y.get(stringsX_Y.size()-1)[0][1]);//返回上一个目录后调用 stringsX_Y.remove(stringsX_Y.size()-1); }; //下面就是通过监听Listview滑动来动态获取index 和 top; // save index and top position int index=0 ; int top=0 ; private AbsListView.OnScrollListener onScrollListener=new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { index = listView_fileList.getFirstVisiblePosition(); View v = listView_fileList.getChildAt(0); top = (v == null) ? 0 : v.getTop(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }; //下面是当点击文件夹时进入子目录,在这个时候就应该记录之前listview的状态index和top; private AdapterView.OnItemClickListener onItemClickListener=new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int[][] strings=new int[1][2]; strings[0][0]=index; strings[0][1]=top; stringsX_Y.add(strings); } };