Android 中保持 ListView 当前滚动位置的方法

107 阅读1分钟

动态修改已绑定的 SimpleAdapter 在重新 setAdapter() 后会导致列表滚动高度还原为 0 的情况: 终于找到了解决方案。
首先我们需要一个记录当前滚动位置的全局变量:
private float OldListY = -1;
然后在 listView 的 onItemClick() 或 onItemLongClick() 事件中获取 OldListY:\

listView.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
 int Pos[] = { -1, -1 }; 
//保存当前坐标的数组 
arg1.getLocationOnScreen(Pos);
 //获取选中的 Item 在屏幕中的位置,以左上角为原点 (0, 0) 
 OldListY = (float) Pos[1];
//我们只取 Y 坐标就行了 } }); 
最后要做的就是在 setAdapter() 后恢复先前的位置:
lstView.setAdapter(adapter); 
// 重新绑定Adapter lstView.setSelectionFromTop(index, (int) OldListY); 
// 恢复刚才的位置 要注意的是,我们在 onItemClick 拿到的 OldListY 
//值并不能完全正确地描述此 Item 的位置,其中存在一个偏移量。 也就是说,OldListY 将比正确值大,
//所以直接使用的枚举(凑数字)偏移量,然后在 OldListY 赋值时一并减去:
ListView.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
int Pos[] = { -1, -1 }; 
//保存当前坐标的数组 arg1.getLocationOnScreen(Pos); 
//获取选中的 Item 在屏幕中的位置,以左上角为原点 (0, 0)
OldListY = (float) Pos[1] - Offset;
//这里减去了偏移量(常量,需要凑出来) 
} }); 

转自:www.littledai.com/20110227/16…