ListView詳解,RecyclerView和ListView的異同

ListView詳解

直接繼承自AbsListView,AbsListView繼承自AdapterView匣屡,AdapterView又繼承自ViewGroup。
Adpater在ListView和數(shù)據(jù)源之間起到了一個橋梁的作用
RecycleBin機制
RecycleBin機制是ListView能夠?qū)崿F(xiàn)成百上千條數(shù)據(jù)都不會OOM最重要的一個原因。RecycleBin是AbsListView的一個內(nèi)部類诈泼。
RecycleBin當(dāng)中使用mActiveViews這個數(shù)組來存儲View唧垦,調(diào)用這個方法后就會根據(jù)傳入的參數(shù)來將ListView中的指定元素存儲到mActiveViews中捅儒。
mActiveViews當(dāng)中所存儲的View,一旦被獲取了之后就會從mActiveViews當(dāng)中移除振亮,下次獲取同樣位置的時候?qū)祷豱ull巧还,所以mActiveViews不能被重復(fù)利用。
addScrapView()用于將一個廢棄的View進行緩存坊秸,該方法接收一個View參數(shù)麸祷,當(dāng)有某個View確定要廢棄掉的時候(比如滾動出了屏幕)就應(yīng)該調(diào)用這個方法來對View進行緩存,RecycleBin當(dāng)中使用mScrapV
iews和mCurrentScrap這兩個List來存儲廢棄View褒搔。
getScrapView 用于從廢棄緩存中取出一個View阶牍,這些廢棄緩存中的View是沒有順序可言的喷面,因此getScrapView()方法中的算法也非常簡單,就是直接從mCurrentScrap當(dāng)中獲取尾部的一個scrap view進行返回荸恕。
我們都知道Adapter當(dāng)中可以重寫一個getViewTypeCount()來表示ListView中有幾種類型的數(shù)據(jù)項乖酬,而setViewTypeCount()方法的作用就是為每種類型的數(shù)據(jù)項都單獨啟用一個RecycleBin緩存機制。

View的流程分三步融求,onMeasure()用于測量View的大小咬像,onLayout()用于確定View的布局,onDraw()用于將View繪制到界面上生宛。

RecyclerView和ListView的異同

在我的一篇介紹Android新控件RecyclerView的博客(Android L新控件RecyclerView簡介)中县昂,一個讀者留言說RecyclerView跟ListView之間好像沒有什么不同,我覺得這是一個好問題陷舅,應(yīng)該明確地區(qū)分一下兩者的睯倒彰,所以我就研究了一下它倆之間的區(qū)別,然后也對兩者的使用有了更加深入的了解莱睁。
Android是一個不斷進化的平臺待讳,Android 5.0的v7版本支持包中引入了新的RecyclerView控件,正如官方文檔所言仰剿,RecyclerView是ListView的豪華增強版创淡。它主要包含以下幾處新的特性,如ViewHolder南吮,ItemDecorator琳彩,LayoutManager,SmothScroller以及增加或刪除item時item動畫等部凑。官方推薦我們采用RecyclerView來取代ListView露乏。
ViewHolder
ViewHolder是用來保存視圖引用的類,無論是ListView亦或是RecyclerView涂邀。只不過在ListView中瘟仿,ViewHolder需要自己來定義,且這只是一種推薦的使用方式比勉,不使用當(dāng)然也可以猾骡,這不是必須的。只不過不使用ViewHolder的話敷搪,ListView每次getView的時候都會調(diào)用findViewById(int),這將導(dǎo)致ListView性能展示遲緩幢哨。而在RecyclerView中使用RecyclerView.ViewHolder則變成了必須赡勘,盡管實現(xiàn)起來稍顯復(fù)雜,但它卻解決了ListView面臨的上述不使用自定義ViewHolder時所面臨的問題捞镰。RecyclerView.ViewHolder被BaseAdapter使用闸与,以將posiiton綁定到上面(可以通過API查看RecyclerView.ViewHolder#getPosition()方法)毙替。
LayoutManager
我們知道ListView只能在垂直方向上滾動,Android API沒有提供ListView在水平方向上面滾動的支持践樱〕Щ或許有多種方式實現(xiàn)水平滑動,但是請想念我拷邢,ListView并不是設(shè)計來做這件事情的袱院。但是RecyclerView相較于ListView,在滾動上面的功能擴展了許多瞭稼。它可以支持多種類型列表的展示要求忽洛,主要如下:
LinearLayoutManager,可以支持水平和豎直方向上滾動的列表环肘。
StaggeredGridLayoutManager欲虚,可以支持交叉網(wǎng)格風(fēng)格的列表,類似于瀑布流或者Pinterest悔雹。
GridLayoutManager复哆,支持網(wǎng)格展示,可以水平或者豎直滾動腌零,如展示圖片的畫廊梯找。
ItemAnimator
列表動畫是一個全新的、擁有無限可能的維度莱没。起初的Android API中初肉,刪除或添加item時,item是無法產(chǎn)生動畫效果的饰躲。后面隨著Android的進化牙咏,Google的Chat Hasse推薦使用ViewPropertyAnimator屬性動畫來實現(xiàn)上述需求。相比較于ListView嘹裂,RecyclerView.ItemAnimator則被提供用于在RecyclerView添加妄壶、刪除或移動item時處理動畫效果。同時寄狼,如果你比較懶丁寄,不想自定義ItemAnimator,你還可以使用DefaultItemAnimator泊愧。
Adapter
ListView的Adapter中伊磺,getView是最重要的方法,它將視圖跟position綁定起來删咱,是所有神奇的事情發(fā)生的地方屑埋。同時我們也能夠通過registerDataObserver在Adapter中注冊一個觀察者。RecyclerView也有這個特性痰滋,RecyclerView.AdapterDataObserver就是這個觀察者摘能。ListView有三個Adapter的默認(rèn)實現(xiàn)续崖,分別是ArrayAdapter、CursorAdapter和SimpleCursorAdapter团搞。然而严望,RecyclerView的Adapter則擁有除了內(nèi)置的內(nèi)DB游標(biāo)和ArrayList的支持之外的所有功能。RecyclerView.Adapter的實現(xiàn)的逻恐,我們必須采取措施將數(shù)據(jù)提供給Adapter像吻,正如BaseAdapter對ListView所做的那樣。
ItemDecoration
在ListView中如果我們想要在item之間添加間隔符梢莽,我們只需要在布局文件中對ListView添加如下屬性即可:

1 android:divider="@android:color/transparent"
2 android:dividerHeight="5dp"

有趣的是萧豆,RecyclerView在默認(rèn)情況下并不在item之間展示間隔符。盡管Google的家伙有意地將這個問題遺留給我們?nèi)プ远x間隔符昏名,但這的確增加了開發(fā)人員的負(fù)擔(dān)涮雷。如果你想要添加間隔符,你必須使用RecyclerView.ItemDecoration類來實現(xiàn)轻局『檠迹或者,你可以應(yīng)用官方示例中的DividerItemDecoration.java文件仑扑。
OnItemTouchListener
ListView通過AdapterView.OnItemClickListener接口來探測點擊事件览爵。而RecyclerView則通過RecyclerView.OnItemTouchListener接口來探測觸摸事件。它雖然增加了實現(xiàn)的難度镇饮,但是卻給予開發(fā)人員攔截觸摸事件更多的控制權(quán)限蜓竹。OthersListView可以設(shè)置選擇模式,并添加MultiChoiceModeListener储藐,如下所示:

 1 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
 2 listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
 3     public boolean onCreateActionMode(ActionMode mode, Menu menu) { ... }
 4     public void onItemCheckedStateChanged(ActionMode mode, int position,
 5 long id, boolean checked) { ... }
 6     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 7         switch (item.getItemId()) {
 8             case R.id.menu_item_delete_crime:
 9             CrimeAdapter adapter = (CrimeAdapter)getListAdapter();
10             CrimeLab crimeLab = CrimeLab.get(getActivity());
11             for (int i = adapter.getCount() - 1; i >= 0; i--) {
12                 if (getListView().isItemChecked(i)) {
13                     crimeLab.deleteCrime(adapter.getItem(i));
14                 }
15           }
16         mode.finish();
17         adapter.notifyDataSetChanged();
18         return true;
19         default:
20             return false;
21 }
22     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { ... }
23     public void onDestroyActionMode(ActionMode mode) { ... }
24 });

而RecyclerView則沒有此功能俱济。

總之,通過比較我們可以發(fā)現(xiàn)钙勃,RecyclerView充滿了大量的自定義功能蛛碌,它可以用于實現(xiàn)復(fù)雜的列表或網(wǎng)格,但實現(xiàn)起來稍顯得復(fù)雜辖源。

原文鏈接:http://www.cnblogs.com/littlepanpc/p/4497290.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔚携,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子克饶,更是在濱河造成了極大的恐慌酝蜒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾湃,死亡現(xiàn)場離奇詭異亡脑,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門远豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坞嘀,你說我怎么就攤上這事躯护。” “怎么了丽涩?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵棺滞,是天一觀的道長。 經(jīng)常有香客問我矢渊,道長继准,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任矮男,我火速辦了婚禮移必,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毡鉴。我一直安慰自己崔泵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布猪瞬。 她就那樣靜靜地躺著憎瘸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陈瘦。 梳的紋絲不亂的頭發(fā)上幌甘,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音痊项,去河邊找鬼锅风。 笑死,一個胖子當(dāng)著我的面吹牛线婚,可吹牛的內(nèi)容都是我干的遏弱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塞弊,長吁一口氣:“原來是場噩夢啊……” “哼漱逸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起游沿,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤饰抒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诀黍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袋坑,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年眯勾,在試婚紗的時候發(fā)現(xiàn)自己被綠了枣宫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婆誓。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖也颤,靈堂內(nèi)的尸體忽然破棺而出洋幻,到底是詐尸還是另有隱情,我是刑警寧澤翅娶,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布文留,位于F島的核電站,受9級特大地震影響竭沫,放射性物質(zhì)發(fā)生泄漏燥翅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一蜕提、第九天 我趴在偏房一處隱蔽的房頂上張望森书。 院中可真熱鬧,春花似錦贯溅、人聲如沸拄氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译柏。三九已至,卻和暖如春姐霍,著一層夾襖步出監(jiān)牢的瞬間鄙麦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工镊折, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胯府,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓恨胚,卻偏偏與公主長得像骂因,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赃泡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 這篇文章分三個部分寒波,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,388評論 0 27
  • afinalAfinal是一個android的ioc升熊,orm框架 https://github.com/yangf...
    passiontim閱讀 15,429評論 2 45
  • 本書主要提出概括性觀點和結(jié)論俄烁,并不會追溯達成這些結(jié)論的過程。 層次:先由抽象概念再推進到具體實例的討論级野。 目錄結(jié)構(gòu)...
    DoSolDo閱讀 119評論 0 0
  • 我页屠,倚靠窗前 看著遠方,燈光點綴 曾經(jīng)泛藍的天空 也已失去了明亮 陌生的人 陌生的城市 陌生的命運 就算多舛 就算...
    Tang永軍閱讀 153評論 0 0