情境
有時候你退出ListView畫面去執行其他程式
後來又回到原本ListView的程式
發現看到一半的資料
又被拉回最頂端
必須要從頭往下拉
對使用者來說, 這是很不方便的設定。
如果我們可以將使用者滑動的ListView位置記住,
當使用者下次再進來的時候, 是從當初看的位置開始讀取,
是否會方便許多呢?
其實這個功能非常的簡單, 不需要太複雜的程式碼就可以完成這個功能。
程式碼說明
我們介面非常的簡單, 在主要畫面塞入一個ListView就可以完成這次的Demo。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_view"/>
</RelativeLayout>
接著在主要程式碼內將ListView加入一些事件。
public class MainActivity extends Activity {
private ListView mListView;
private String[] list = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
private static int position;
private static int top;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView)findViewById(R.id.list_view);
mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
mListView.setOnScrollListener(new OnScrollListener(){
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
position = mListView.getFirstVisiblePosition();
View v = mListView.getChildAt(0);
top = (v == null) ? 0 : v.getTop();
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
mListView.setSelectionFromTop(position, top);
super.onResume();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
上面可以看出, 我們將ListView塞入26個英文字母, 方便我們觀察, 首先加入OnScrollListener事件, 在滾動ListView的時候, 便將第一個row的位置記住, 下次進來的時候, 再對ListView進行上次存取的位置切換。
一開始的畫面
隨意滑動
按back回到程式集
再切回程式, 仍然回到剛剛切出去的畫面。