記錄和恢復(fù)ListView的滑動位置

前言

有時候我們需要記錄和恢復(fù)ListView的滑動位置,網(wǎng)上給出大體的解決方案有2種。

  1. 記錄上次滑動的坐標(biāo),恢復(fù)的時候直接scrollTo
  2. 記錄listView顯示在屏幕上的第一個item的位置,然后利用setSelection恢復(fù)

我們分別來探討一下這兩種方案。

1、記錄上次滑動的坐標(biāo),恢復(fù)的時候直接scrollTo

網(wǎng)上的步驟是通過監(jiān)聽ListView的滑動,在他停止滑動時通過listView.getScrollY();獲取他的滑動坐標(biāo),然后再用scrollTo去恢復(fù)。
這樣存在的問題是,getScrollY()永遠(yuǎn)為0,scrollTo會出現(xiàn)后面沒有刷新的內(nèi)容(一片空白)。

2、記錄listView顯示在屏幕上的第一個item的位置

getFirstVisiblePosition來記錄和恢復(fù)可以避免方案1的各種問題,但是,他無法精確的恢復(fù)原來的位置,只是回滾到以getFirstVisiblePosition的View的起始位置。

我的解決方案

首先一要能精確回滾,二要能避免回滾后出現(xiàn)的一片空白。
所以只能放棄方案2,完善方案1,解決要點(diǎn)在于:

正確獲取getScrollY()的滑動坐標(biāo)

    public int getScrollY() {
        View c = mListView.getChildAt(0);
        if (c == null) {
            return 0;
        }
        int firstVisiblePosition = mListView.getFirstVisiblePosition();
        int top = c.getTop();
        return -top + firstVisiblePosition * c.getHeight() ;
    }

這里的實(shí)現(xiàn)思路比較簡單,就是計算屏幕顯示部分上面的高度,通過獲取第一個view(顯示的)的top坐標(biāo)(負(fù)數(shù)),用這個絕對值加上他之前的高度和就可以算出滑動的y坐標(biāo)。

正確的回滾

直接scrollTo明顯是不行的,他會導(dǎo)致后面有一片空白,而且一滑動ListView會重新刷新一下界面有明顯的卡頓。

因此,我們只能使用smoothScrollBy的方法,短時間內(nèi)平滑移動至記錄的位置。
簡單的通過smoothScrollBy來恢復(fù)明顯是不行的,我們需要通過post方法去實(shí)現(xiàn)。

        mListView.post(new Runnable() {
            @Override
            public void run() {
                mListView.smoothScrollBy(scrolledY, 0);
            }
        });

這樣就可以正確的回滾之前記錄的位置。

小結(jié)

以上是小弟在解決該問題的一個小小思路,寫出來方便大家一起探討交流。
最后附上代碼(比較簡陋):


/**
 * 用于記錄和恢復(fù)ListView的滑動位置
 * Created by ONEWateR on 2015/10/16.
 */
public class ListViewRecord {

    private ListView mListView;

    private int scrolledY;

    public ListViewRecord(ListView listView) {
        mListView = listView;
    }

    /**
     * 設(shè)置listView的滑動監(jiān)聽
     */
    public void initEvent() {
        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // 不滾動時記錄當(dāng)前滾動到的位置
                if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    record();
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });
    }

    /**
     * 記錄位置
     */
    public void record() {
        scrolledY = getScrollY();
    }

    /**
     * 獲取ListView的ScrollY
     * @return
     */
    public int getScrollY() {
        View c = mListView.getChildAt(0);
        if (c == null) {
            return 0;
        }
        int firstVisiblePosition = mListView.getFirstVisiblePosition();
        int top = c.getTop();
        return -top + firstVisiblePosition * c.getHeight() ;
    }

    /**
     * 恢復(fù)位置
     */
    public void restore() {
        mListView.post(new Runnable() {
            @Override
            public void run() {
                mListView.smoothScrollBy(scrolledY, 0);
            }
        });
    }

}

使用方法:

初始化

ListViewRecord record = new ListViewRecord(listView);
record.initEvent();

恢復(fù)

record.restore();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內(nèi)容