Android:RecyclerView的使用(附菜單創(chuàng)建)

在android應(yīng)用中經(jīng)常要看到一些列表式的東西,比如QQ、微信的消息列表,還有網(wǎng)格式及瀑布式的格局,這些東西讓我們看起來相當(dāng)?shù)挠幸?guī)則,看起來算是比較美觀的,今天我主要介紹RecyclerView的使用。

RecyclerView這個控件引自v7包,在使用前切記要導(dǎo)包。

RecyclerView說白了就是ListView的升級版,不過它只關(guān)注回收和復(fù)用,在ListView中有時候根據(jù)需要我們會自定義適配器adapter,自定義適配器就一定要復(fù)寫getView()方法。這時就要暴露一個問題,單純在這里面給那些控件設(shè)置屬性就可以了嗎?當(dāng)然你可以這么做,但是你要考慮一個問題,如果你的信息量非常大,比如現(xiàn)在你的ListView中有1w、10w甚至更多的item你覺得你的應(yīng)用會奔潰嗎?— —我覺得應(yīng)該是會的,并且是死于內(nèi)存溢出。所以針對性能上的問題,我們通常會設(shè)置一個ViewHolder輔助類來作為item的緩存,這樣就基本實現(xiàn)了內(nèi)存的復(fù)用。

RecyclerView與之不同,官方給它配置了一個專用的適配器RecyclerView.Adapter。該適配器的使用與之前我們自定義的略有區(qū)別,為了讓ViewHolder得到更多的重視,以及性能方面的考慮,官方把這個適配器和ViewHolder綁定在一起。這次我們不再去創(chuàng)建getView(),而是將其功能一分為二,分別是onCreateViewHolder()和onBindViewHolder(),看名字就知道,前者是創(chuàng)建ViewHolder,后者是綁定,也就是設(shè)置一個ViewHolder給設(shè)置屬性。

廢話不多說,接下來上干貨:

源碼地址:https://github.com/QianLiStudent/MyStudyDemoRepository

1. 首先是在布局文件設(shè)置一下RecyclerView這個控件,此處不贅述。

2. (前面說RecyclerView是ListView的升級版)定義好數(shù)據(jù)源(通常用集合,可以動態(tài)添加、刪除元素等)、適配器、初始化RecyclerView對象、給RecyclerView設(shè)置適配器。


數(shù)據(jù)源的話大家就在創(chuàng)建適配器之前自己設(shè)置吧。

3. RecyclerView是多變的,它可以變換成很多種類的格局,常見的有列表式、網(wǎng)格式、瀑布式等。接下來我們要做的就是設(shè)置布局管理器recyclerView.setLayoutManager(),其參數(shù)針對上面提到的有列表式:LinearLayoutManager(參數(shù)查看api文檔),網(wǎng)格式:GridLayoutManager(參數(shù)查看api文檔),瀑布式:StaggeredGridLayoutManager(參數(shù)查看api文檔)。

4. 第3步走完就可以顯示了,這里是展示的是列表式,那么怎么讓RecyclerView動態(tài)變換格局呢?看這里:

這里我設(shè)置一個菜單,故這里采用switch做匹配,一開始我們設(shè)置布局管理器采用setLayoutManager(),變換其實就是setLayoutManager(格局1)→setLayoutManager(格局2),參數(shù)是布局管理器,詳情查看api。

5. 這樣做出來之后你就可以運行了,但是總是覺得哪里不對勁???沒錯,他變成一整塊面板了,對某些人來說(至少對我來說)很丑對吧?這好辦,給它設(shè)置分隔線不就得了

由于官方并沒有提供分隔線相關(guān)的java類,故我們需要自己去寫一個或者采用其他作者所寫的,我們也可以考慮在res/values/styles.xml中自己定義,這里我覺得沒什么必要,當(dāng)然也是根據(jù)需要啦。不過啊,我覺得專門去做一個分隔線不管采用上面哪種方式都挺麻煩的,這里有一個十分方便的辦法。首先你要知道,我們設(shè)置分隔線是給誰設(shè)置的?——沒錯,就是給item,為了讓item與item之間有明顯的邊界,我們可以在設(shè)置布局文件的時候給最外層的控件(即XXXLayout)設(shè)置一個android:layout_margin="xxx",這里我把margin設(shè)置為全方位的外邊距,顯得四周都有分隔,當(dāng)然可以根據(jù)自己需要來設(shè)定,這樣我們也能做出分割線的效果,個人覺得還是挺美觀的,而且使用也方便。

6. 上面提到RecyclerView是ListView的升級版,自然它也和ListView一樣是用來做內(nèi)容容器的。我們不能要求用戶只使用我們提供的固定數(shù)據(jù),因此這里我們需要在adapter中寫添加和刪除的方法。


這里我為了測試就直接把保存的數(shù)據(jù)寫成“Insert here”,根據(jù)需要這里應(yīng)該在add后面的參數(shù)增加一個要保存的數(shù)據(jù),position參數(shù)表示你要添加的數(shù)據(jù)的位置,合法的位置是: ? ? 0~集合Object.size()(tip:這個合法位置是針對add方法的)。我們在添加集合元素前面設(shè)置position是為了讓集合中的數(shù)據(jù)順序和控件展示順序一致。加進(jìn)去之后我們要提醒adapter數(shù)據(jù)發(fā)生變化了,讓它做數(shù)據(jù)更新,這時就要調(diào)用notifyItemInserted(position),對指定位置做局部刷新。注意,這里我們不能使用notifyDataSetChanged(),這么做會把所有的數(shù)據(jù)都刷新一遍,是會降低性能的。接下來是delete,其后面的參數(shù)也是指定要刪除item的位置,合法的位置是:0~集合Object.size()— 1(tip:這個合法位置是針對delete方法的),然后調(diào)用notifyItemRemoved(position),這里也是局部刷新。在使用的時候有時候代碼提示會出現(xiàn)notifyItemChanged(position),這個是改變,即如果你在add的時候使用這個方法進(jìn)行刷新,那么在你指定位置的item會被你新添加進(jìn)來的item給取代掉,也就是說集合數(shù)量增加了,但是你在適配器這里數(shù)量沒有增加,只是把position的item給替換掉了內(nèi)容。慎用 ?慎用 ?慎用~~

7. RecyclerView這個控件啊,官方做的還是很貼心的,他給我們提供了RecyclerView中的默認(rèn)動畫類DefaultItemAnimator,使用如下:

使用方式超級簡單,至于動畫類是怎么做的有興趣的可以去研究,但是單純使用的話就上面一句話就夠了,是不是很貼心 ~ ,個人覺得這個效果還是很棒的,當(dāng)然有很多大神自己寫了動畫,大家也可以去參考別人的或者考到本地引用,根據(jù)需要吧。

8. 展示出來的信息本來就是給別人看的,顯示在表面的畢竟內(nèi)容有限,我們通常會在點擊或者其他事件觸發(fā)后進(jìn)入到更深層看到item內(nèi)部的具體內(nèi)容,就點擊而言,我們就要給item設(shè)置點擊事件來監(jiān)聽和做事件處理,對吧。但是官方并沒有給我們提供任何的類、接口啥的,故我們需要自己定義接口,這里這里:

這里定義的回調(diào)方法是為了讓適配器監(jiān)聽item點擊系列事件,當(dāng)該回調(diào)方法被調(diào)用的時候回傳過來一個實例對象,下面通過判斷是否為空來判斷是否有調(diào)用該回調(diào)方法。也就是如果你不設(shè)置監(jiān)聽器,是沒有辦法觸發(fā)監(jiān)聽事件的。

此方法在onBindViewHolder中調(diào)用,在adapter中我們會多次使用到holder.itemView。這個其實是我們定義了ViewHolder類的子類,從父類那里繼承過來的屬性itemView,holder在這里可以理解為一條本緩沖過得item所代表的對象,holder.itemView才是一條真正的item,然后在Activity中的adapter給它設(shè)置監(jiān)聽器就可以做監(jiān)聽了。有讀者會想到為什么這里監(jiān)聽到事件后不直接在這里做處理呢?干嘛還回調(diào)到別的地方去?是的,你的想法是沒錯的,但是我們要考慮一個問題,你在這邊貌似什么都做不了,什么Toast,Dialog,Intent啥都做不了,就像有一個工作室B了解(理解為代碼中的監(jiān)聽)到工作室A有一個項目要找人外包,但是由于某種原因自己做不了,故把這個機(jī)會推薦給工作室C讓他們?nèi)プ觥?/p>

這里提一下瀑布流高度是怎么實現(xiàn)的。

瀑布流的格局我們看起來是高度不一的對吧。那其實就是一個隨機(jī)數(shù)生成的高度,我們定義一個隨機(jī)數(shù),然后在onBindViewHolder中給設(shè)置一下高度就行了,代碼如下:


這個隨機(jī)數(shù)集合我們可以放在構(gòu)造方法中實現(xiàn)
這里參數(shù)命名都很明確,就不再贅述

AS是默認(rèn)沒有給菜單的初始化和事件監(jiān)聽的方法了,因此我們需要自己去創(chuàng)建:onCreateOptionMenu()和onOptionItemSelected(),在這之前我們要在res下創(chuàng)建一個Menu的folder:右鍵res - New - Android Resources Directory - Resources Type - menu,建完folder之后在里面創(chuàng)建一個Menu Resources File,然后xml里面的內(nèi)容就是一個一個的item

android:showAsAction=“ifRoom”設(shè)置在標(biāo)題欄處,若為“never”則作為隱藏列表菜單項

然后是先前提到的兩個方法:


中間的內(nèi)容根據(jù)需要自己補充吧。

以上是關(guān)于RecyclerView基本使用的整體流程及menu的創(chuàng)建和引用。

本文的學(xué)習(xí)內(nèi)容學(xué)自鴻洋大神在慕課網(wǎng)的視頻:

https://www.imooc.com/learn/424

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 308,452評論 27 440
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • (我的公眾號:章喬) 期待你來 臨近期末了,本來應(yīng)該一門心思好好復(fù)習(xí)的,我卻還是忍不住 “誘惑”,在不充裕的復(fù)習(xí)時...
    章喬閱讀 1,838評論 0 1
  • 從小學(xué)開始我就是個小胖子,長大點就變成一個不折不扣的大胖子,小時候爸爸總是寵愛的說我胖胖的可愛。我也一直活在這種...
    奔著幸福跑的豬閱讀 629評論 0 0
  • 話說這次老公帶狗回來又是先斬后奏,第一次我暴跳如雷,立馬送人;第二次我憤怒至極,放到媽家養(yǎng)了幾天也送人了……這...
    焱妃夕妍雪閱讀 339評論 0 0

友情鏈接更多精彩內(nèi)容