Android開發之漫漫長途 XVI——ListView與RecyclerView項目實戰
該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相關知識,另外也借鑒了其他的優質博客,在此向各位大神表示感謝,膜拜!!!
前言
Hello,大家好,有沒有想我,這一個月沒有更新文章,為什麽呢,大聲的告訴你,,我在...(準備面試 ps:南京)。至於怎麽準備的,以及在面試中遇到的問題還有面試結果之類的,我們下面呢會挑一些與ListView和RecyclerView相關的內容說一下,至於其他的後文再說,畢竟不能打亂我們之前的行文安排(嗯,我就是這麽一個十分有節操的人)。
我們上一篇說了些什麽呢,RecyclerView,這個東西已經漸漸替代ListView成為我們Android開發工程師中常見的控件。按照上一篇的預告呢,我們本篇是來實戰的。因為畢竟本地數據的展示基本上只能作為Demo,在實際的工作以及項目中,我們遇到的問題可能要比Demo復雜的多。
面試中遇到的關於ListView以及RecyclerView的問題
第一題 ListView的緩存復用機制
還是免不得筆試啊,,起碼我面試的幾家公司有80%讓我答一份試卷,而且給你的時間與試卷的復雜度基本上對應不上。(無語。。。)不是說技術上有什麽難點,不過你想完美的答出來,估計要寫不少字,比如其中一題ListView的緩存復用機制。
關於ListView的緩存復用機制在
Android開發之漫漫長途 XIV——ListView
一文中有非常詳細的解說,這邊我們就不重復說了,如果你看過我的那一篇文章,你就明白,這個事情不花個半小時是講不清楚的,更何況是寫。所以我們在讀書或者讀別人博客的時候要善於總結,抓住核心。
第二題
上來打開一個界面,類似淘寶上的首頁,問這個頁面怎麽布局?
請讀者先稍微思考個5分鐘再向下看。。。。。
我的思考過程是這樣的
- 首先是根部局,根部局我在項目中用的最多的是LinearLayout、RelativeLayout、FrameLayout這些布局,不過明顯這些根部局不符合滑動的條件,必須在其內部定義ScrollView,或者直接頂層就用ScrollView,
- 使用ScrollView作為頂層布局或者子布局
- 對於內部的列表子View顯示可使用RecyclerView
直接說了,然後被打臉了,說是ScrollView的話對於含有大量Bitmap的很多View,滑動的話很容易造成OOM。有沒有更好的方案。
然後面試官說了一句,可不可以考慮用RecyclerView作為根部局,然後嵌套RecyclerView呢,,我茅塞頓開,,然後就沒有然後了。
其實我對於RecyclerView的理解陷入了一個誤區,畢竟在項目中只是拿它做一些列表展示。完全沒有想過用它作為布局的一種,其實也是對於RecyclerView的item type等相關知識理解的不夠深入。如果用RecyclerView作為根部局雖然也有許多麻煩之處,但是它帶來的好處也是很明顯的。
註:我不清楚淘寶到底是怎麽做的哈,,只是舉例說明一下而已
第三題 ListView異步獲取圖片顯示錯位
關於這一題實際上是第一題ListView的緩存復用機制的一個實戰題目,關於這個現象是如何產生的以及如何解決,郭神已經在其博客中深入分析了,我這裏就不獻醜了,讀者可參看Android ListView異步加載圖片亂序問題,原因分析及解決方案
小結
現在大多數商業內容性的App基本上都需要使用列表來展示,不管是使用比較老的ListView,還是正被廣泛使用的RecyclerView,這兩者都在面試中碰到過。現在來總結一下。
ListView:對於ListView來說,考察最多的是關於ListView的性能優化(其原理也是ListView的復用機制),使用ViewHolder,然後在重寫的getView方法中復用convertView,對於這兩點可能大部分讀者都了然於胸。當然還有更加直接的方式,如我碰到的第1題。
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項目實戰