1. 程式人生 > >Android開發之漫漫長途 XVI——ListView與RecyclerView項目實戰

Android開發之漫漫長途 XVI——ListView與RecyclerView項目實戰

列表 系列 緩存 廣泛 原理 前言 評論 request 功能點

該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相關知識,另外也借鑒了其他的優質博客,在此向各位大神表示感謝,膜拜!!!


前言

Hello,大家好,有沒有想我,這一個月沒有更新文章,為什麽呢,大聲的告訴你,,我在...(準備面試 ps:南京)。至於怎麽準備的,以及在面試中遇到的問題還有面試結果之類的,我們下面呢會挑一些與ListView和RecyclerView相關的內容說一下,至於其他的後文再說,畢竟不能打亂我們之前的行文安排(嗯,我就是這麽一個十分有節操的人)。

我們上一篇說了些什麽呢,RecyclerView,這個東西已經漸漸替代ListView成為我們Android開發工程師中常見的控件。按照上一篇的預告呢,我們本篇是來實戰的。因為畢竟本地數據的展示基本上只能作為Demo,在實際的工作以及項目中,我們遇到的問題可能要比Demo復雜的多。

面試中遇到的關於ListView以及RecyclerView的問題

第一題 ListView的緩存復用機制

還是免不得筆試啊,,起碼我面試的幾家公司有80%讓我答一份試卷,而且給你的時間與試卷的復雜度基本上對應不上。(無語。。。)不是說技術上有什麽難點,不過你想完美的答出來,估計要寫不少字,比如其中一題ListView的緩存復用機制。
關於ListView的緩存復用機制在

Android開發之漫漫長途 XIV——ListView

一文中有非常詳細的解說,這邊我們就不重復說了,如果你看過我的那一篇文章,你就明白,這個事情不花個半小時是講不清楚的,更何況是寫。所以我們在讀書或者讀別人博客的時候要善於總結,抓住核心。

第二題

上來打開一個界面,類似淘寶上的首頁,問這個頁面怎麽布局?
技術分享圖片
請讀者先稍微思考個5分鐘再向下看。。。。。

我的思考過程是這樣的

  1. 首先是根部局,根部局我在項目中用的最多的是LinearLayout、RelativeLayout、FrameLayout這些布局,不過明顯這些根部局不符合滑動的條件,必須在其內部定義ScrollView,或者直接頂層就用ScrollView,
  2. 使用ScrollView作為頂層布局或者子布局
  3. 對於內部的列表子View顯示可使用RecyclerView

直接說了,然後被打臉了,說是ScrollView的話對於含有大量Bitmap的很多View,滑動的話很容易造成OOM。有沒有更好的方案。

然後面試官說了一句,可不可以考慮用RecyclerView作為根部局,然後嵌套RecyclerView呢,,我茅塞頓開,,然後就沒有然後了。

其實我對於RecyclerView的理解陷入了一個誤區,畢竟在項目中只是拿它做一些列表展示。完全沒有想過用它作為布局的一種,其實也是對於RecyclerView的item type等相關知識理解的不夠深入。如果用RecyclerView作為根部局雖然也有許多麻煩之處,但是它帶來的好處也是很明顯的。

註:我不清楚淘寶到底是怎麽做的哈,,只是舉例說明一下而已

第三題 ListView異步獲取圖片顯示錯位

關於這一題實際上是第一題ListView的緩存復用機制的一個實戰題目,關於這個現象是如何產生的以及如何解決,郭神已經在其博客中深入分析了,我這裏就不獻醜了,讀者可參看Android ListView異步加載圖片亂序問題,原因分析及解決方案

小結

現在大多數商業內容性的App基本上都需要使用列表來展示,不管是使用比較老的ListView,還是正被廣泛使用的RecyclerView,這兩者都在面試中碰到過。現在來總結一下。

  1. ListView:對於ListView來說,考察最多的是關於ListView的性能優化(其原理也是ListView的復用機制),使用ViewHolder,然後在重寫的getView方法中復用convertView,對於這兩點可能大部分讀者都了然於胸。當然還有更加直接的方式,如我碰到的第1題。

  2. RecyclerView:對於RecyclerView來說,
    比較簡單的呢,碰到過對ItemDecoration 以及 如何添加HeaderView以及FooterView;
    比較復雜的呢,碰到過直接讓你復述RecyclerView的緩存復用機制,也有RecyclerView內幾萬甚至更多條數據為什麽沒有OOM這種間接的問法。另外也碰到了對比於ListView來說,RecyclerView的優勢等等問題。(關於這些問題,我上一篇文章裏也都提到,讀者可參看 Android開發之漫漫長途 XV——RecyclerView);

我的TDK

這是我在Github上的一個小小的開源項目,項目地址在文末給出,難度也不大,主要是用來面試的時候用來展示的Demo。讀者可以稍微看一下,涉及一下幾個內容。
主界面如下所示

技術分享圖片

底部導航

使用Fragment進行導航切換,這部分內容可參看我之前關於Fragment的文章

RecyclerView的下拉刷新和上拉加載

這個使用的是BRAVH的開源庫,關於更多使用指南,請參看官網http://www.recyclerview.org/

RecyclerView自定義LayoutManager

這部分內容可參看自定義LayoutManager 實現弧形以及滑動放大效果RecyclerView

Material Design 協調布局(CoordinatorLayout)

技術分享圖片


本篇總結

本篇呢是個實戰項目,先是分享了面試中遇到的關於ListView以及RecyclerView的問題,然後分享了一個小Demo。只是拋磚引玉,讀者呢可在我的博客下評論,分享一些面試中遇到的問題。另外Demo中也有很多部分都虛位以待,讀者也可以提出一些功能點,提Issue或者Pull request給我。


下篇預告

下一篇呢,我會整理一下我的面試過程,,然後盡快分享出來,給大家做一個參考。



源碼地址:源碼傳送門

此致,敬禮

Android開發之漫漫長途 XVI——ListView與RecyclerView項目實戰