1. 程式人生 > >學習RecyclerView和CardView

學習RecyclerView和CardView

之前在GitHub上看一些開源專案原始碼時,發現有這兩個控制元件,貌似之前一直沒有見到過,所以現在決定學習下。
先來看RecyclerView,RecyclerView 元件是一個更高階和伸縮性更強的 ListView,是Android Lollipop中的新widget,使用時和LIstView相比多了一個RecyclerView.LayoutManager,用來測量和定位RecyclerView中每個item的檢視,並決定什麼時候重用不可見的元素檢視。要重用(或回收)檢視時,layout manager 會讓 adapter 用另外的元素內容替換檢視內的內容。

RecyclerView 提供以下內建的 layout manager:
LinearLayoutManage

:用於顯示橫向或縱向的滾動列表
GridLayoutManager :用於顯示方格元素
StaggeredGridLayoutManager :在 staggered 方格中顯示元素

而且還提供了預設的動畫,新增和刪除元素的動畫在 RecyclerView 中是預設被啟用的。要自定義動畫,你需要繼承RecyclerView.ItemAnimator 類,使用RecyclerView.setItemAnimator()方法。

CardView多和RecyclerView一起使用,作為RecyclerView的item,CardView 是一個容器類,繼承於 FrameLayout 類,也就擁有FrameLayout 的屬性,CardView的最主要的一個特點是可以說設定陰影和圓角:

使用以下屬性來自定義CardView:
使用card_view:cardCornerRadius在layout中設定圓角
使用CardView.setRadius在程式碼中設定圓角
使用card_view: cardElevation來設定 shadow
使用card_view:carBackgroundColor來設定背景顏色,可以讓card看起來在浮在背景上

有了一個大概的認識後,就具體通過一個例子學習:

為了使用RecyclerView和CardView需要引入v7 Support Library,這裡使用的是Android studio,在專案中的 build.grade檔案中的dependencies塊中加入如下程式碼,就可以在老的Android版本使用:

dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'
    compile 'com.android.support:recyclerview-v7:21.0.+'
}

1、 先建立一個CardView
利用一個LinearLayout來放置 CardView,CardView包含兩個TextView,用來顯示人名和年齡,一個ImageView,用來顯示頭像。這裡要注意因為CardView 是由the Android v7 support library提供,所以他的attributes 不在android:這個名稱空間中,必須定義自己的名稱空間,並且作為cardView屬性的字首,例如

    xmlns:card_view="http://schemas.android.com/apk/res-auto"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <android.support.v7.widget.CardView
        android:id="@+id/cv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardBackgroundColor="#6495ed"
        card_view:cardCornerRadius="20dp"
        card_view:cardElevation="14dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp">

            <ImageView
                android:id="@+id/person_photo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="16dp"
                android:src="@drawable/ic_launcher" />

            <TextView
                android:id="@+id/person_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_toRightOf="@+id/person_photo"
                android:text="張三"
                android:textSize="30sp" />

            <TextView
                android:id="@+id/person_age"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/person_name"
                android:layout_toRightOf="@+id/person_photo"
                android:text="20 歲" />

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

效果如下:
這裡寫圖片描述

可以看到CardView四個邊角有一個圓角,並且有一個shadow,同時有一個背景色。

2、 建立一個RecyclerView:
步驟一: 在Layout定義

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rv"
    />

在activity 中獲取到:

RecyclerView rv = (RecyclerView)findViewById(R.id.rv);

步驟二:使用LayoutManager
與ListView不同,RecyclerView 需要LayoutManager來管理其中的Item的位置,可以通過繼承RecyclerView.LayoutManager類定義自己的LayoutManager,但是,大多數情況下,只需要使用
LayoutManager 預先定義的子類:
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager

這裡使用LinearLayoutManager

LinearLayoutManager llm = new LinearLayoutManager(context);
rv.setLayoutManager(llm);

步驟三:定義Data

同LIstView相同,RecyclerView也需要一個adapter來獲取它的資料,在建立一個adapter之前,先建立一個person類,然後寫一個方法來初始化一個List的Person物件:

class Person {
    String name;
    String age;
    int photoId;

    Person(String name, String age, int photoId) {
        this.name = name;
        this.age = age;
        this.photoId = photoId;
    }
}

private List<Person> persons;
private void initializeData(){
    persons = new ArrayList<>();
    persons.add(new Person("Emma Wilson", "23 years old", R.drawable.emma));
    persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.lavery));
    persons.add(new Person("Lillie Watts", "35 years old", R.drawable.lillie));
}

步驟四:建立一個adapter

繼承RecyclerView.Adapter,這個adapter遵循View holder的設計,意味著要定義一個類繼承 RecyclerView.ViewHolder,在ListView中一般是我們自己定義的。

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{

    public static class PersonViewHolder extends RecyclerView.ViewHolder {      
        CardView cv;
        TextView personName;
        TextView personAge;
        ImageView personPhoto;

        PersonViewHolder(View itemView) {
            super(itemView);
            cv = (CardView)itemView.findViewById(R.id.cv);
            personName = (TextView)itemView.findViewById(R.id.person_name);
            personAge = (TextView)itemView.findViewById(R.id.person_age);
            personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
        }
    }

}

接下來,定義一個構造方法,可以將RecyclerView 用來顯示的資料傳進來,這裡,我們的資料格式是一個Person的List

List<Person> persons;

RVAdapter(List<Person> persons){
    this.persons = persons;
}

RecyclerView.Adapter有三個我們必須重寫的抽象方法,先來看getItemCount()方法,這個方法返回傳進來的資料的條數:

@Override
public int getItemCount() {
    return persons.size();
}

接下來是重寫onCreateViewHolder ()方法,這個方法在自定的ViewHolder 需要初始化的時候呼叫,需要指明RecyclerView 每個Item需要使用的layout,通過LayoutInflater載入進來。

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

最後,重寫onBindViewHolder ()方法,來指明每個Item中的內容,有點類似ListView的adapter中的getView()方法。

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.personName.setText(persons.get(i).name);
    personViewHolder.personAge.setText(persons.get(i).age);
    personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}

步驟五:使用Adapter

這個就很簡單了.

RVAdapter adapter = new RVAdapter(persons);
rv.setAdapter(adapter);

最後的效果如下:
這裡寫圖片描述

相關推薦

學習RecyclerViewCardView

之前在GitHub上看一些開源專案原始碼時,發現有這兩個控制元件,貌似之前一直沒有見到過,所以現在決定學習下。 先來看RecyclerView,RecyclerView 元件是一個更高階和伸縮性更強的 ListView,是Android Lol

RecyclerViewCardView的使用以及注意

距離RecyclerView和CardView的出現已經很久了,網上也有很多關於這方面的部落格。因為最近自己在專案中用到了Material Design設計規範,所以才第一次接觸到了RecyclerView和CardView。在這篇部落格中,我將給大家介紹一

怎樣開始學習ADFJdeveroper 11g

started deb 細致 建立 cat sed size rda 培訓 先給一些資料能夠幫助剛開始學習的人開始學習ADF和Jdeveloper11g 1.首先毫無疑問,你要懂java語言。 能夠看看Thinking In Java。 或者原來sun的網上的一些文

ios學習8_KVC字典轉模型

strong format des source -a ldr orm resource undle Key Value Coding是cocoa的一個標準組成部分,它能讓我們能夠通過name(key)的方式訪問屬性,某些情況下極大地簡化了代碼。可稱之為cocoa的大招

視頻學習記錄規劃day08

考試題目 記錄 應用層 網絡 模型 規劃:2017-4-24 周一 第5章前2h2017-4-25 周二 第5章中2h2017-4-26周三 第5章 後2h tcp三次握手和子網劃分等2017-4-27周四 第6章 2h2017-4-28周五 第6-7閉卷考試 錄屏 以及第7章考試題目講

視頻學習記錄規劃day12

記錄2017年5月23日 周二 第一章 前1h2017年5月24日 周三 第一章 後2.5h2017年5月25日 周四 第二章 前2h年5月26日 周五 第二章 後2h 2017年5月27日 周六第三章 4h (我擦,俄噶看得完呀!)顯示解析的整個過程叠代就是遞歸的一部分![[email prot

數學之美(吳軍著)學習總結經典摘抄

語音識別 用戶輸入 問題 font 客戶 連接 進行 聯系 -m 第1章 語言和文字 VS數字和信息 1.不同的文明,由於地域的原因。歷史上相互隔絕。便會有不同的文字。隨著文明的融合與沖突,不同文明下的人們須要交流,或者說通信,那麽翻譯的需求便產生了。翻譯這件事之所

python入門學習-列表元組(1)

索引 個人 .so .cn pytho 入門 main 範圍 mage 數據結構是通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合。這些數據元素可以是數字或者字符,甚至可以是其他數據結構。 在python中,最基本的數據結構是序列(seque

etcd的學習心得使用

etcd 單機 cluster 學習操作1 etcd key-value 存儲結構 “A highly-available key value store for shared configuration and service discovery.”  Etcd是coreos開發的分布式服務系統,內部采用r

java mybatis學習之$#區別,mapper代理接口,動態SQL,在日誌中輸出mybatis的sql語句

except 控制臺 處理方式 ron target 技術分享 需要 prefix job 1.在mybatis中,$和#的區別: #{}:表示一個預處理參數,參數類型不定,是根據傳入的參數類型來設定的。類似於JDBC中的? 特例使用,模糊查詢:(針對oracle): an

安全學習工具研究途徑整理分享

結果 在線 spa from imap 安裝 文件包含漏洞 測試 遠程服務 希望可以幫助大家拓寬自己的安全學習、研究範圍,多了解一些提升自己安全的途徑。 本文作者:i春秋簽約作家——夏之冰雪 恩,首先我分享國內top 3的最重要途徑: 1. i春秋學院課程,裏面有大量的精品

redis學習--簡介安裝

key-value shel 解壓 過去 內存 下載 local 完成 test 1.redis介紹: Redis 與其他 key - value 緩存產品有以下三個特點: Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。 Re

Qt學習: QFileDialogQMessageBox的用法程序示例

window 軟件 編程 計算機 qt *QMessageBox的用法: members: 1.void setStandardButtons(QMessageBox::); //設置按鈕. 2.void setText(QString);

轉:25個Java機器學習工具

重點 推薦系統 mine 很多 .sh 分類器 ssi 包括 eve 轉自:http://www.cnblogs.com/data2value/p/5419864.html 本列表總結了25個Java機器學習工具&庫: 1. Weka集成了數據挖掘工作的機器學習算法

Qt學習: QPaintEventQMouseEvent的簡單程序示例

軟件 window 編程 QMouseEvent下可以被重寫的虛函數: 1.void mousePressEvent(QMouseEvent *event); //鼠標鍵被按下的事件. 2.void mouseReleaseEvent(QMouseEvent *event); //鼠標鍵被放開的事

java學習路線知識圖譜

輸入輸出 out shiro 掌握 sql入門 inux 源碼 瀏覽器 處理 1.計算機基礎: 1.1數據機構基礎: 主要學習:1.向量,鏈表,棧,隊列和堆,詞典。熟悉2.樹,二叉搜索樹。熟悉3.圖,有向圖,無向圖,基本概念4.二叉搜索A,B,C類熟練,9大排序熟悉。5.樹

.Net Core 2.0 學習路由請求參數傳遞

com var 技術分享 net oca style 靈活 比較 cor 一、配置默認路由方式 {Controller=Home}/{action=Index}/{id?} 默認請求地址:http://localhost:xxx/home/index /id? 是可選項例

Go語言學習-maininit

都是 函數 很多 學習 導入 同時 如果 ack 它的 main 函數和 init 函數Go裏面有兩個保留的函數: init 函數(能夠應用於所有的 package )和 main 函數(只能應用於 package main )。這兩個函數在定義時不能有任何的參數和返回值。

python 4學習 list tuple

倒數 exe 插入 .py cti 集合 出了 技術 hub list Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。 比如,列出班裏所有同學的名字,就可以用一個list表示: >>> classm

SQL 基礎學習深度學習資料

原子 rom 深度學習 允許 important href system 持久 cti SQL is a standard language for storing, manipulating and retrieving data in databasee. 關系型數據庫