MainActivity如下:
package cc.testlistview; import java.util.ArrayList; import java.util.HashMap; import cn.com.bravesoft.testlistviewloadmore.R; import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListView; import android.widget.SimpleAdapter; /** * Demo描述: * 保存和恢复ListView的当前位置 * * 注意事项: * onScrollStateChanged()方法中 * v.getTop()方法的文档描述: * Top position of this view relative to its parent. * * 测试方法: * 1 运行应用,滑动ListView * 2 ListView停止滑动后,按下back退出应用 * 3 重新进入应用,ListView保持原位置 */ public class MainActivity extends Activity { private int position; private int listViemItemTop; private ListView mListView; private SimpleAdapter mSimpleAdapter; private HashMap<String, Object> mHashMap; private ArrayList<HashMap<String, Object>> mArrayList; private final String LISTVIEW_PREFERENCES = "listview_preferences"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { mListView = (ListView) findViewById(R.id.listView); mArrayList = new ArrayList<HashMap<String, Object>>(); addDataForListView(); mSimpleAdapter = new SimpleAdapter( MainActivity.this, mArrayList, R.layout.listviewitem, new String[] { "id" }, new int[] { R.id.textView }); mListView.setAdapter(mSimpleAdapter); mListView.setOnScrollListener(new OnScrollListenerImple()); } private void addDataForListView() { for (int i = 0; i < 20; i++) { mHashMap = new HashMap<String, Object>(); mHashMap.put("id", "" + i); mArrayList.add(mHashMap); } } @Override public void onPause() { super.onPause(); SharedPreferences mySharedPreferences = getSharedPreferences(LISTVIEW_PREFERENCES,Activity.MODE_PRIVATE); SharedPreferences.Editor edit = mySharedPreferences.edit(); edit.putInt("listViemItemTop", listViemItemTop); edit.putInt("position", position); edit.commit(); } @Override public void onResume() { super.onResume(); SharedPreferences sharedPreferences = getSharedPreferences(LISTVIEW_PREFERENCES,Activity.MODE_PRIVATE); listViemItemTop = sharedPreferences.getInt("listViemItemTop", 0); position = sharedPreferences.getInt("position", 0); //reset ListView location mListView.setSelectionFromTop(position, listViemItemTop); } private class OnScrollListenerImple implements OnScrollListener { @Override public void onScroll(AbsListView listView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } @Override public void onScrollStateChanged(AbsListView listview, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { position = mListView.getFirstVisiblePosition(); View itemView = mListView.getChildAt(0); listViemItemTop = (itemView == null) ? 0 : itemView.getTop(); System.out.println("---> listViemItemTop=" + listViemItemTop); } } } }
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerInParent="true" /> </RelativeLayout>
listviewitem.xml如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:gravity="center" android:layout_height="80dip" /> </RelativeLayout>