如何讓ListView記住你所點過的位置

如何讓ListView記住你所點過的位置

情境

有時候你退出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回到程式集


再切回程式, 仍然回到剛剛切出去的畫面。

github