RecyclerView
是一個 ViewGroup
,它用於渲染任何基於適配器的 View
。它被官方定義爲 ListView
和 GridView
的取代者,是在 Support V7
包中引入的。使用該組件的一個理由是:它有一個更易於擴展的框架,尤爲是它提供了橫向和縱向兩個方向滾動的能力。當數據集合根據用戶的操做或網絡狀態的變化而變化時,你很須要這個控件。html
要使用 RecyclerView
,須要如下的幾個元素:java
RecyclerView.Adapter
:使用RecyclerView以前,你須要一個繼承自RecyclerView.Adapter的適配器,做用是將數據與每個item的界面進行綁定。android
LayoutManager
:用來肯定每個item如何進行排列擺放,什麼時候展現和隱藏。回收或重用一個View的時候,LayoutManager會向適配器請求新的數據來替換舊的數據,這種機制避免了建立過多的View和頻繁的調用findViewById方法(與ListView原理相似)網絡
ItemAnimator
:用於讓常見操做(例如添加或移除列表項)變得活潑app
RecyclerView 項目結構:框架
此處,當 RecyclerView
添加或移除列表項時,它還提供了動畫支持,動畫操做在當前的實現下,是很是困難的事情。而且,ViewHolder
在 RecyclerView
中被深度集成,再也不只是一個推薦方式。ide
由於如下幾個理由,RecyclerView
與它的前輩 ListView
是不相同的:佈局
適配器中須要 ViewHolder :ListView
中,要提高性能,你能夠不實現 ViewHolder
,能夠嘗試其它的選擇;可是在 RecyclerView
的適配器中,ViewHolder
是必需要使用的。性能
自定義列表項佈局 :ListView
只能把列表項以線性垂直的方式進行安排,而且不能自定義;RecyclerView
的 RecyclerView.LayoutManager
類,可讓任何列表項在水平方向排列,或是以交錯的網格模式排列。動畫
簡單的列表項動畫 :關於添加或移除列表項的操做,ListView
並無添加任何的規定;對於 RecyclerView
來講,它有一個 RecyclerView.ItemAnimator
類,能夠用來處理列表項的動畫。
手動的數據源 :對於不一樣類型的數據源來講,ListView
有着不一樣的適配器與之對應,例如 ArrayAdapter
,CursorAdapter
。與此相反,RecyclerAdapter
須要開發者本身實現提供給適配器的數據。
手動的列表項裝飾 :ListView
有 android:divider
屬性,用於設置列表項之間的分隔。與此相反,要給 RecyclerView
設置分隔線的裝飾,須要手動使用 RecyclerView.ItemDecoration
對象。
手動監測點擊事件 :ListView
爲列表上的每一個列表項的點擊事件都使用 AdapterView.OnItemClickListener
接口進行了綁定。與之不一樣的是,RecyclerView
只提供了 RecyclerView.OnItemTouchListener
接口,它能夠管理單個的 touch
事件,而再也不內嵌點擊事件的處理
LayoutManager
用於在 RecyclerView
中管理列表項的位置,對於再也不對用戶可見的視圖來講,它還能決定何時重用這些視圖。
RecyclerView
提供瞭如下幾種內嵌的佈局管理器:
LinearLayoutManager
:在水平或垂直的滾動列表上顯示列表項
GridLayoutManager
:在網格中顯示列表項
StaggeredGridLayoutManager
:在交錯的網格中顯示列表項
繼承 RecyclerView.LayoutManager
就能夠建立自定義的佈局管理器。
RecyclerView
包含一種新的適配器,它與你以前使用過的適配器很相似,只是包含了一些特殊之處,例如必須的 ViewHolder
等。要使用這些適配器,須要重寫兩個方法:1. 用於渲染視圖和 ViewHolder
的方法;2. 用於把數據綁定到視圖的方法。每當須要建立一個新的視圖時,都會調用第一個方法,再也不須要檢測視圖是否被回收。
RecyclerView.ItemAnimator
將會使要通知適配器的 ViewGroup
的改變(例如添加/刪除/選擇列表項)動起來。DefaultItemAnimator
能夠用於基本的默認動畫,而且表現不俗。
使用步驟
1、導包
注意:引入V7的包才能使用RecyclerView控件
2、主佈局文件代碼
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context="com.example.testrecycleview.MainActivity" 6 android:orientation="vertical" 7 > 8 9 <Button 10 android:id="@+id/button1" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:layout_alignParentLeft="true" 14 android:layout_alignParentTop="true" 15 android:layout_marginLeft="22dp" 16 android:layout_marginTop="14dp" 17 android:text="Button" /> 18 19 <android.support.v7.widget.RecyclerView 20 android:id="@+id/id_recyclerview" 21 android:layout_width="match_parent" 22 android:layout_height="match_parent" 23 android:divider="#ffff0000" 24 android:dividerHeight="10dp" > 25 </android.support.v7.widget.RecyclerView> 26 27 </LinearLayout>
3、RecyclerView子Item的佈局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal" > 6 7 <TextView 8 android:id="@+id/tv_username" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:text="TextView" 12 android:textSize="25sp" 13 /> 14 15 <TextView 16 android:id="@+id/tv_sex" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:text="TextView" 20 android:textSize="15sp" 21 /> 22 23 <ImageView 24 android:id="@+id/imageView1" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:src="@drawable/ic_launcher" /> 28 29 </LinearLayout>
4、MainActivity.java代碼
1 package com.example.testrecycleview; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.support.v7.widget.LinearLayoutManager; 9 import android.support.v7.widget.RecyclerView; 10 import android.support.v7.widget.RecyclerView.Adapter; 11 import android.support.v7.widget.RecyclerView.ItemDecoration; 12 import android.support.v7.widget.RecyclerView.ViewHolder; 13 import android.view.LayoutInflater; 14 import android.view.View; 15 import android.view.View.OnClickListener; 16 import android.view.ViewGroup; 17 import android.widget.Button; 18 import android.widget.ImageView; 19 import android.widget.TextView; 20 import android.widget.Toast; 21 22 23 public class MainActivity extends Activity { 24 25 private RecyclerView recyclerView; 26 private List<User> userList; 27 private Button btn; 28 29 @Override 30 protected void onCreate(Bundle savedInstanceState) { 31 super.onCreate(savedInstanceState); 32 setContentView(R.layout.activity_main); 33 34 userList = new ArrayList<User>(); 35 for (int i = 0; i < 8; i++) { 36 User user = new User(); 37 user.setUsername("小明"+i); 38 user.setSex("男"+i); 39 userList.add(user); 40 } 41 42 recyclerView = (RecyclerView)findViewById(R.id.id_recyclerview); 43 recyclerView.setLayoutManager(new LinearLayoutManager(this)); 44 recyclerView.setAdapter(new MyAdapter()); 45 recyclerView.addItemDecoration(new ItemDecoration() { 46 }); 47 48 btn = (Button) findViewById(R.id.button1); 49 btn.setOnClickListener(new OnClickListener() { 50 51 @Override 52 public void onClick(View v) { 53 54 User u = new User(); 55 u.setUsername("小紅紅"); 56 u.setSex("人妖"); 57 userList.add(u); 58 Toast.makeText(MainActivity.this, "ok", 500).show(); 59 } 60 }); 61 62 63 User u2 = new User(); 64 u2.setUsername("小紅紅2"); 65 u2.setSex("人妖2"); 66 userList.add(u2); 67 } 68 69 class MyAdapter extends Adapter<MyHolder>{ 70 71 @Override 72 public int getItemCount() { 73 return userList.size(); 74 } 75 76 @Override 77 public void onBindViewHolder(MyHolder holder, int index) { 78 holder.tv_username.setText( userList.get(index).getUsername() ); 79 holder.tv_sex.setText( userList.get(index).getSex() ); 80 } 81 82 @Override 83 public MyHolder onCreateViewHolder(ViewGroup arg0, int arg1) { 84 LayoutInflater inflater = getLayoutInflater(); 85 //佈局文件 86 View view = inflater.inflate(R.layout.item_layout, arg0,false); 87 //控件徹底體 88 MyHolder holder = new MyHolder(view); 89 return holder; 90 } 91 92 } 93 94 /* 95 * 控件的徹底體 96 */ 97 class MyHolder extends ViewHolder{ 98 TextView tv_username; 99 TextView tv_sex; 100 ImageView imageView1; 101 102 public MyHolder(View sup) { 103 super(sup); 104 tv_username = (TextView)sup.findViewById(R.id.tv_username); 105 tv_sex = (TextView)sup.findViewById(R.id.tv_sex); 106 imageView1 = (ImageView)sup.findViewById(R.id.imageView1); 107 } 108 109 } 110 111 }
運行結果