1. 程式人生 > >使用 RecyclerView 控制元件實現瀑布流

使用 RecyclerView 控制元件實現瀑布流

RecyclerView相比於ListView, 在回收重用時更具有靈活性, 也就是低耦合, 並且提供了擴充套件. 載入多個檢視時, 應該多用RecyclerView代替ListView.

那麼我們來看看這東西應該怎麼用? 比如生成一個瀑布流的檢視.

recycler-waterfall

首先我們從一個HelloWorld寫起, 看看如何構建一個RecyclerView.

依賴

Gradle配置, 新增RecyclerView庫的依賴.

Java
1 compile'com.android.support:recyclerview-v7:+'

佈局

佈局檔案

Java
1234 <android.support.v7.widget.RecyclerViewandroid:id="@+id/test_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>

程式碼

LayoutManager: 管理RecyclerView的結構.
Adapter: 處理每個Item的顯示.
ItemDecoration: 新增每個Item的裝飾.
ItemAnimator: 負責新增\移除\重排序時的動畫效果.

LayoutManager\Adapter是必須, ItemDecoration\ItemAnimator是可選.

Java
123456789101112 /** * 初始化RecyclerView * * @param recyclerView 主控制元件 */privatevoidinitRecyclerView(RecyclerView recyclerView){recyclerView.setHasFixedSize(true);// 設定固定大小initRecyclerLayoutManager(recyclerView);// 初始化佈局initRecyclerAdapter(recyclerView);// 初始化介面卡initItemDecoration(recyclerView);// 初始化裝飾initItemAnimator(recyclerView);// 初始化動畫效果}

LayoutManager

管理RecyclerView的佈局結構.

Java
12345 privatevoidinitRecyclerLayoutManager(RecyclerView recyclerView){// 錯列網格佈局recyclerView.setLayoutManager(newStaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));}

提供了多種LayoutManager, 瀑布流使用錯列網格佈局.

Adapter

介面卡, 處理RecyclerView的Item事務.

Java
1234 privatevoidinitRecyclerAdapter(RecyclerView recyclerView){mAdapter=newMyAdapter(getData());recyclerView.setAdapter(mAdapter);}

對於Adapter, 我們需要展開來說, 先看看類.

Java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 publicclassMyAdapter extendsRecyclerView.Adapter<MyViewHolder>{privateList<DataModel>mDataModels;privateList<Integer>mHeights;MyAdapter(List<DataModel>dataModels){if(dataModels==null){thrownewIllegalArgumentException("DataModel must not be null");}mDataModels=dataModels;mHeights=newArrayList<>();}@OverridepublicMyViewHolder onCreateViewHolder(ViewGroup parent,intviewType){View itemView=LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler_view,parent,false);returnnewMyViewHolder(itemView);}@OverridepublicvoidonBindViewHolder(MyViewHolder holder,intposition){DataModel dataModel=mDataModels.get(position);// 隨機高度, 模擬瀑布效果.if(mHeights.size()<=position){mHeights.add((int)(100+Math.random()*300));}ViewGroup.LayoutParams lp=holder.getTvLabel().getLayoutParams();lp.height=mHeights.get(position);holder.getTvLabel().setLayoutParams(lp);holder.getTvLabel().setText(dataModel.getLabel());holder.getTvDateTime().setText(newSimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH).format(dataModel.getDateTime()));}@OverridepublicintgetItemCount(){returnmDataModels.size();}publicvoidaddData(intposition){DataModel model=newDataModel();model.setDateTime(getBeforeDay(newDate(),position));model.setLabel("No. "+(int)(newRandom().nextDouble()*20.0f));mDataModels.add(position,model);notifyItemInserted(position);}publicvoidremoveData(intposition){mDataModels.remove(position);notifyItemRemoved(position);}/**     * 獲取日期的前一天     *     * @param date 日期     * @param i    偏離     * @return 新的日期     */privatestaticDate getBeforeDay(Date date,inti){Calendar calendar=Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_YEAR,i*(-1));returncalendar.getTime();}}

onCreateViewHolder建立ViewHolder.
onBindViewHolder繫結每一項資料.
getItemCount返回列表長度.

RecyclerView強制使用ViewHolder.

Java
1234567891011121314151617181920 publicclassMyViewHolder extendsRecyclerView.ViewHolder{privateTextView mTvLabel;// 標籤privateTextView mTvDateTime;// 日期publicMyViewHolder(View itemView){super(itemView);mTvLabel=(TextView)itemView.findViewById(R.id.item_text);mTvDateTime=(TextView)itemView.findViewById(R.id.item_date);}publicTextView getTvLabel(){returnmTvLabel;}publicTextView getTvDateTime(){returnmTvDateTime;}}

在onCreateViewHolder方法, 建立類; 在onBindViewHolder方法, 繫結資料.

DataModel

Java
123456789101112131415161718192021 publicclassDataModel{privateStringmLabel;privateDate mDateTime;publicStringgetLabel(){returnmLabel;}publicvoidsetLabel(Stringlabel){mLabel=label;}publicDate getDateTime(){returnmDateTime;}publicvoidsetDateTime(Date dateTime){mDateTime=dateTime;}}

ItemDecoration

項的裝飾, 比如ListView中的分割線, 在本例中, 左右兩條粉線.

Java
123 privatevoidinitItemDecoration(RecyclerView recyclerView){recyclerView.addItemDecoration(newMyItemDecoration(this));}

ItemDecoration, 注意parent和child的使用方式.

相關推薦

使用 RecyclerView 控制元件實現瀑布

RecyclerView相比於ListView, 在回收重用時更具有靈活性, 也就是低耦合, 並且提供了擴充套件. 載入多個檢視時, 應該多用RecyclerView代替ListView. 那麼我們來看看這東西應該怎麼用? 比如生成一個瀑布流的檢視. 首先我們從一個Hell

5.使用RecyclerView優雅的實現瀑布效果

/** * 作者:Pich * 原文連結:http://me.woblog.cn/ * QQ群:129961195 * 微信公眾號:woblog * Github:https://github.com/lifengsofts */ 概述 從前我們想實現一個瀑布流效果是

Android學習之RecyclerView學習(實現瀑布式佈局)

RecyclerView,大家可以通過匯入support-v7對其進行使用。  如果使用AndroidStudio開發, 需要在build.gradle中新增: compile 'com.android.support:appcompat-v7:24.2.1' com

Android中Recyclerview使用13----實現瀑布遇到的各種問題(item移動,載入更多圖片閃爍,以及定製各種型別Header和Footer)

功能:圖片瀑布流 問題1:如何保持已顯示過的imageview的尺寸 解決方法:定義一個HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用來儲存已顯示過的Ima

RecyclerView實現瀑布

效果圖: Main佈局只是一個RecyclerView <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.

RecyclerView的簡單使用以及實現瀑布效果

RecyclerView 簡介 RecyclerView是support.v7包中的控制元件,可以認為是ListView和GridView的增強版,RecyclerView提供了一個耦合度更低的方式來複用ViewHolder,可以更輕鬆的實現瀑布流的效果,為增加和刪除條目提

Android 自定義控制元件:打造佈局實現熱門搜尋標籤

具體實現 1,自定義一個類繼承GridView /** * 自定義流佈局 * @author zhouyou */ public class ZFlowLayout extends ViewGroup{ // 儲存所有子View priva

Android中利用RecyclerView實現瀑布效果

RecyclerView相比於傳統的ListView,功能更加強大,使用也比較方便,因此Android官方更加推薦使用RecycleView,未來也會有更多的程式逐漸從ListView轉向RecycleView。為此,首先先來了解下RecycleView的用法。當然,最先看

[置頂] RecyclerView實現瀑布,圖片自適應高度

話不多說,先上效果圖 對於RecyclerView,相信大家都不陌生了,這個集listView,GridView,瀑布流效果與一身強大控制元件,漸漸地滲透在每個App.... 還是回到正題,如何讓RecyclerView裡的圖片自適應高度? 我們知道,要讓RecyclerView有瀑布流效果,R

recyclerview實現瀑布佈局

先看效果,這裡我用的背景圖片, 首先匯入依賴 compile 'com.android.support:recyclerview-v7:26.1.0' 下面就是程式碼,首先是佈局 activity_main <RelativeLayout xmlns:a

Android中RecyclerView實現瀑布圖片顯示

效果圖: 具體程式碼如下:(註釋很詳細,基本每句都要註釋) MainActivity.java package com.zhiyuan3g.recyclerviewwaterfall; import android.content.Intent; import an

RecyclerView 實現瀑布及點選事件,含點選回撥的介面

RecyclerView 實現瀑布流及點選事件 public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> { private List

Android RecyclerView 實現瀑布交錯效果,並使最後一行子View高度佔滿RecyclerView

而在實現完瀑布流後,覺得滑動到底部時,最後一行的高度,沒有佔滿外部View,感覺不太好。(真正的瀑布流應該是條目數近乎無窮,可以一直載入更多) 既然是瀑布流,那麼就選用StaggeredGridLayoutManager。 mRecyclerView.s

關於RecyclerView實現瀑布,上下滑動時item之間互換位置的問題

  最近專案需求,需要RecyclerView實現瀑布流。在用 StaggeredGridLayoutManager 完成瀑布流的過程中發現一個問題:它並不像pullToRefresh 那樣是穩定的list,而是item之間頻繁交換位置,有時候甚至會出現第一列和第二列完全互

RecyclerView實現瀑布的效果

效果圖如下 原始碼如下: MainActivity頁面 public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private

Android 自定義控制元件之打造佈局實現熱門搜尋標籤

最終效果 首先來看看效果圖: 其他地方很好實現,就是熱門搜尋有點麻煩,由於資料的不確定性,那麼像GridView明顯不能滿足了,這時候就只能自己來定義一個佈局了。 最終實現後的效果: 具體實現 1,自定義一個類繼承

Fresco和 RecyclerView 實現瀑布

RecyclerView 實現瀑布流非常的簡單,只需要設定佈局管理為 StaggeredGridLayoutManager。然後還需要設定ItemDecorator 1:大概的步驟如下.具體的步驟在下面的下面. 0:匯入RecyclerView,Fresco 1:佈

Android開發之玩轉FlexboxLayout佈局(可用於普通控制元件實現式佈局,也可結合RecycleView實現式佈局)

在這之前,我曾認真的研究過鴻洋大神的Android 自定義ViewGroup 實戰篇 -> 實現FlowLayout,按照大神的思路寫出了一個流式佈局,所有的東西都是難者不會會者不難,當自己能自定義流式佈局的時候就會覺得這東西原來很簡單了。如果各位小夥伴也看過那篇

RecyclerView 實現瀑布效果

上次用RecyclerView實現了ListView的效果,這次用RecyclerView實現一個瀑布流的效果~ 先上效果圖: 是不是感覺不錯啊~ 其實很簡單~ 只要換一個佈局管理器就行了 mRecyclerView.setLayoutManager(new Sta

RecyclerView實現瀑布,圖片自適應高度

話不多說,先上效果圖 對於RecyclerView,相信大家都不陌生了,這個集listView,GridView,瀑布流效果與一身強大控制元件,漸漸地滲透在每個App.... 還是回到正題,如何讓RecyclerView裡的圖片自適應高度? 我們知道,要讓Recycler