这里只写一种方法,直接利用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);
}
};