android仿朋友圈列表精準(zhǔn)定位

好久沒有寫東西了响驴,一直想寫點啥但也不知道寫啥,糾結(jié)到今天決定大膽的寫一篇小技巧類的文章撕蔼,之前是想繼續(xù)寫IM來著豁鲤,只是服務(wù)器掛了又有各種事情的困擾。鲸沮。琳骡。好吧,以后一定堅持下去K夏纭i购拧!
背景:之前做過一款包含類似朋友圈功能的應(yīng)用怒坯,細心的朋友會發(fā)現(xiàn)當(dāng)滑動朋友圈列表查看朋友們的各種曬圖之后直接返回到發(fā)現(xiàn)界面炫狱,這時候再次進入朋友圈列表會直接定位到上次查看的地方,當(dāng)時我就想到了采用singleInstance這種啟動模式剔猿,后來發(fā)現(xiàn)這種模式不行毕荐,會造成身體各種不適(比如嘔吐啊腹瀉啊之類的),開個玩笑O(∩_∩)O哈哈~

總之翻來覆去輾轉(zhuǎn)反側(cè)以至于側(cè)夜未眠之后就想到了列表定位的方法輕松的實現(xiàn)了艳馒,當(dāng)然和IOS的同事溝通后發(fā)現(xiàn)他們實現(xiàn)起來是真心的方便憎亚,直接設(shè)置單例并保存在內(nèi)存中直到應(yīng)用退出都會身體倍棒吃嘛嘛香员寇,真真是郁了個悶的。

當(dāng)時大家普遍還在用ListView第美,所以本文采用的是ListView的實現(xiàn)方式蝶锋,下次可能會再寫一篇使用RecycleView實現(xiàn)的,畢竟是主流了嘛(__) 嘻嘻……

使用RecycleView定位的可以看這篇
android RecyclerView實現(xiàn)列表定位

一不小心就說的有點多了什往,直接進入正題吧:
先上個圖:

listview_location.gif

先對ListView注冊監(jiān)聽扳缕,使用API提供的OnScrollListener來監(jiān)聽滾動事件mListView.setOnScrollListener(this)
這里使用最簡單的ArrayAdapter作為列表的適配器

List<String> lists = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            lists.add("我是item" + i);
        }
        String[] datas = lists.toArray(new String[lists.size()]);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, 
                android.R.layout.simple_list_item_1, datas);

為了方便,這里直接使用List.toArray把List轉(zhuǎn)換為數(shù)組
注冊監(jiān)聽后覆寫了兩種方法

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

我們在onScrollStateChanged這里獲取列表滑動后當(dāng)前顯示在屏幕上的第一個position

Paste_Image.png

然后獲取當(dāng)前顯示在屏幕中的第一個item view

Paste_Image.png

注意:這個getChildAt(0)指的不是列表中的第一個item别威,而是當(dāng)前顯示在屏幕上的第一個可見的item躯舔,主要獲取這個item與父控件也即ListView的頂部距離

Paste_Image.png

通過SharedPreferences把這兩個值保存起來

Paste_Image.png

到這里基本就大功告成了,設(shè)置adapter后獲取這兩個保存的值

Paste_Image.png

最后調(diào)用listview提供的setSelectionFromTop這個方法就能完美實現(xiàn)啦

Paste_Image.png

這里要剖析下它和setSelection(int position)的區(qū)別:
setSelection的內(nèi)部也是調(diào)用了setSelectionFromTop這個方法省古,只不過
y值傳了0

Paste_Image.png

調(diào)用這個方法后它會直接找到設(shè)置的position并定位粥庄,不過頂部的距離為0,也就是說上次滾動后只要當(dāng)前屏幕內(nèi)可見的第一個position的item露出了一點豺妓,再次進入也會把它全部顯示出來惜互,setSelectionFromTop的源碼如下:

Paste_Image.png
Paste_Image.png

這個方法內(nèi)主要做的事情就是查找position計算頂部偏移量,然后調(diào)用requestLayout()這個方法重新調(diào)用onMeasure和Onlayout重新設(shè)置自己的位置琳拭,這樣就能做到精準(zhǔn)確定上次瀏覽的位置了训堆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市白嘁,隨后出現(xiàn)的幾起案子坑鱼,更是在濱河造成了極大的恐慌,老刑警劉巖絮缅,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁沥,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟蚣,警方通過查閱死者的電腦和手機黍析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門卖怜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屎开,“玉大人,你說我怎么就攤上這事马靠⊙俪椋” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵甩鳄,是天一觀的道長逞度。 經(jīng)常有香客問我,道長妙啃,這世上最難降的妖魔是什么档泽? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任俊戳,我火速辦了婚禮,結(jié)果婚禮上馆匿,老公的妹妹穿的比我還像新娘抑胎。我一直安慰自己,他們只是感情好渐北,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布阿逃。 她就那樣靜靜地躺著,像睡著了一般赃蛛。 火紅的嫁衣襯著肌膚如雪恃锉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天呕臂,我揣著相機與錄音破托,去河邊找鬼。 笑死诵闭,一個胖子當(dāng)著我的面吹牛炼团,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疏尿,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瘟芝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了褥琐?” 一聲冷哼從身側(cè)響起锌俱,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敌呈,沒想到半個月后贸宏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡磕洪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年吭练,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析显。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲫咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷异,到底是詐尸還是另有隱情分尸,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布歹嘹,位于F島的核電站箩绍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尺上。R本人自食惡果不足惜材蛛,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一圆到、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卑吭,春花似錦构资、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至河绽,卻和暖如春己单,著一層夾襖步出監(jiān)牢的瞬間错忱,已是汗流浹背疗垛。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孝常,地道東北人苟跪。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓廷痘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親件已。 傳聞我的和親對象是個殘疾皇子笋额,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,282評論 25 707
  • 簡介 在Android開發(fā)中ListView是比較常用的組件。 以列表的形式展示具體內(nèi)容篷扩。 并且能夠根據(jù)數(shù)據(jù)的長度...
    上善若水Ryder閱讀 6,986評論 2 5
  • 最近在整理之前運用到的一些技術(shù) , 關(guān)于定位 我完善了一下知識體系 , 今天跟大家分享一下 關(guān)于定位 CLLoc...
    KumLight閱讀 825評論 0 0
  • 陽光從天窗照進大廳 我在光里獨舞 凝思兄猩、尋找、仰望 在暗處獨舞 三百六十度旋轉(zhuǎn)劈叉 祈求鉴未、自愛 我的身體在光影之間...
    琴鍵上跳舞的米老鼠閱讀 189評論 0 1
  • 集合的聲明 集合的聲明使用 mapOf枢冤,listOf 和 setOf 等。 當(dāng)然它們也可以不指定泛型铜秆,如: 使用m...
    Mindjet閱讀 414評論 0 2