RecyclerView可以說是增強版的ListView,不僅具有ListVIew的效果,還彌補許多ListView的不足。
一、RecyclerView的基本用法
與百分比布局類似,RecyclerView也屬於新增的控件,為了使RecyclerView在所有Android版本上都能使用,Android團隊采取了同樣的方式,將RecyclerView定義在了support庫當中。因此想要使用RecyclerView這個控件,首先需要在項目的build.gradle中添加相應的依賴庫才行。
第一步:打開app/build.gradle文件,在dependencies閉包中添加:
implementation 'com.android.support:recyclerview-v7:27.1.1'
添加完成后,需要點擊右上角的Sync Now
第二步:在activity_mian.xml中添加RecyclerView控件,控件寬度和高度都設置為與父布局一致,注意:RecyclerView不是內置在系統的SDK中,所以要把完整的包路徑寫出來。
第三步:創建Fruit實體類,定義兩個字段:水果名稱、水果圖片id,每個字段定義一個get()方法,用於獲取字段,定義一個構造函數,傳入兩個字段。
第四步:創建水果子項布局fruit_item.xml,添加水果圖片控件(ImageView)、水果名稱控件(TextView)
第五步:自定義適配器FruitAdapter,繼承RecyclerView.Adapter,泛型指定為:FruitAdapter.ViewHolder
第六步:在MainActivity中完成適配器配置
第七步:運行程序,滑動屏幕,和上一章ListView的效果一樣
二、RecyclerView實現橫向滑動
第一步:修改fruit_item.xml中的代碼(Fruit子項布局)
1、orientation="vertical":將子項布局方式改為垂直(控件與框架之間垂直排列),寬度改為“100dp”,設為固定值是為了防止子項因為水果文字的長短而有長有短,顯得非常不美觀
2、layout_gravity="center_horizontal":將水果圖片和水果名稱都設置為在布局中水平居中
3、layout_marginTop:讓文字和圖片之間保持一段距離。
第二步:在MainActivity中,設置布局的排列方向:setOrientation()方法,默認是縱向排列,橫向排列:LinearLayoutManager.HORIZONTAL
第三步:運行程序,滑動屏幕效果如下
三、RecyclerView實現瀑布流布局
除了LinearLayoutManager之外,RecyclerView還提供了GridLayoutManager和StaggeredGridLayoutManager這兩種內置的布局排列方式,GridLayoutManager可以實現網格布局,StaggeredGridLayoutManager可以用於實現瀑布流布局,下面我們就來實現一下瀑布流布局。
第一步:修改fruit_item.xml中的代碼
1、將LinearLayout的寬度改為:match_parent,因為瀑布流布局的寬度應該由布局的列數來自動適配
2、layout_margin屬性:使每個子項之間都互留一定的間距,不至於貼得太近。
第二步:將布局排列方式改為瀑布流布局:StaggeredGridLayoutManager
StaggeredGridLayoutManager()構造函數中傳入兩個參數:
第一個參數:用於指定布局的列數,4表示指定布局的列數為4列。
第二個參數:用於指定布局的排列方向:StaggeredGridLayoutManager.VERTICAL(布局縱向排列)
第三步:運行程序,上下滑動屏幕效果如下:
四、RecyclerView的點擊事件
和ListView一樣,RecyclerView也必須要有點擊事件才行,但是不同於ListView 的點擊事件,RecyclerView沒有提供類似於:setOnItemClickListener()這樣的注冊監聽器方法,而是需要我們自己給子項具體的View去注冊點擊事件,相比ListView來說,實現要復雜一點。
為什么要這么做呢?這是因為ListView在點擊事件上的處理並不人性化,setOnItemClickListener()方法注冊的是子項的點擊事件,而不是子項里具體某個按鈕的點擊事件,雖然ListView也能夠實現點擊子項里面某個具體的按鈕,但是實現起來相對比較麻煩。所以RecyclerView直接摒棄了子項點擊事件的監聽器,所有的點擊事件都由具體的View去注冊,就沒有這個困擾了。
下面具體來看看RecyclerView中的注冊點擊事件。
第一步:在FruitAdapter適配器中注冊點擊事件
1、在ViewHolder中保存水果子項最外層布局實例
2、在onCreateViewHolder中注冊監聽事件
viewHolder.fruitView.setOnClickListener():子項最外層布局的點擊事件
viewHolder.fruitImage.setOnClickListener():水果圖片的點擊事件
第二步:運行程序,分別點擊圖片和文字,效果如下:
1、點擊Apple圖片,觸發了ImageView的點擊事件:顯示:You Clicked imageApple
2、點擊Banana文字,由於TextView沒有注冊點擊事件,被子項最外層布局捕獲到了,因此顯示:You Clicked viewBanana