Android之RecyclerView(一)

 

 

概述


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

 

與 ListView 的對比


由於如下幾個理由,RecyclerView 與它的前輩 ListView 是不相同的:佈局

  • 適配器中須要 ViewHolder :ListView 中,要提高性能,你能夠不實現 ViewHolder,能夠嘗試其它的選擇;可是在 RecyclerView 的適配器中,ViewHolder 是必需要使用的。性能

  • 自定義列表項佈局 :ListView 只能把列表項以線性垂直的方式進行安排,而且不能自定義;RecyclerView 的 RecyclerView.LayoutManager 類,可讓任何列表項在水平方向排列,或是以交錯的網格模式排列。動畫

  • 簡單的列表項動畫 :關於添加或移除列表項的操做,ListView 並無添加任何的規定;對於 RecyclerView 來講,它有一個 RecyclerView.ItemAnimator類,能夠用來處理列表項的動畫。

  • 手動的數據源 :對於不一樣類型的數據源來講,ListView 有着不一樣的適配器與之對應,例如 ArrayAdapterCursorAdapter。與此相反,RecyclerAdapter須要開發者本身實現提供給適配器的數據。

  • 手動的列表項裝飾 :ListView 有 android:divider 屬性,用於設置列表項之間的分隔。與此相反,要給 RecyclerView 設置分隔線的裝飾,須要手動使用 RecyclerView.ItemDecoration 對象。

  • 手動監測點擊事件 :ListView 爲列表上的每一個列表項的點擊事件都使用 AdapterView.OnItemClickListener 接口進行了綁定。與之不一樣的是,RecyclerView 只提供了 RecyclerView.OnItemTouchListener 接口,它能夠管理單個的 touch 事件,而再也不內嵌點擊事件的處理

 

 

RecyclerView 的組件


 

LayoutManager

  LayoutManager 用於在 RecyclerView 中管理列表項的位置,對於再也不對用戶可見的視圖來講,它還能決定何時重用這些視圖。

RecyclerView 提供瞭如下幾種內嵌的佈局管理器:

  • LinearLayoutManager :在水平或垂直的滾動列表上顯示列表項

  • GridLayoutManager :在網格中顯示列表項

  • StaggeredGridLayoutManager :在交錯的網格中顯示列表項

繼承 RecyclerView.LayoutManager 就能夠建立自定義的佈局管理器。

RecyclerView.Adapter

  RecyclerView 包含一種新的適配器,它與你以前使用過的適配器很相似,只是包含了一些特殊之處,例如必須的 ViewHolder 等。要使用這些適配器,須要重寫兩個方法:1. 用於渲染視圖和 ViewHolder 的方法;2. 用於把數據綁定到視圖的方法。每當須要建立一個新的視圖時,都會調用第一個方法,再也不須要檢測視圖是否被回收。

ItemAnimator

  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>
activity_main.xml

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>
item_layout.xml

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 }
MainActivity

 

運行結果

 

詳細可參考:http://www.cnblogs.com/wchhuangya/p/6086464.html

相關文章
相關標籤/搜索