標籤:art 執行個體 擴充性 oncreate red protect 步驟 布局 col
RecycleView
簡介:
RecylerView是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁有item回收複用的功能,這一點從它的名字recylerview即回收view也可以看出。
優點及作用:
根據官方的介紹RecylerView是ListView的升級版,既然如此那RecylerView必然有它的優點,現就RecylerView相對於ListView的優點羅列如下:
- RecylerView封裝了viewholder的回收複用,也就是說RecylerView標準化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了,複用的 邏輯被封裝了,寫起來更加簡單。
- 提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecylerView專門抽取出了相應的類,來控制Item的顯示,使其的擴充性非常強。例如:你想控制橫向(解決了ListView只可以縱向分布的問題)或者縱向滑動列表效果可以通過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑布流對應的還有StaggeredGridLayoutManager等),也就是說RecylerView不再拘泥於ListView的線性展示方式,它也可以實現GridView的效果等多種效果。你想控制Item的分隔線,可以通過繼承RecylerView的ItemDecoration這個類,然後針對自己的業務需求去抒寫代碼。
- 可以控制Item增刪的動畫,可以通過ItemAnimator這個類進行控制,當然針對增刪的動畫,RecylerView有其自己預設的實現。
初步使用RecycleView
首先第一步是匯入v7包
右鍵項目,點擊Open Module Settings
進入以下介面,點擊Dependencies
點擊左下角的+符號
點擊第一項Library dependency,進入以下介面選擇recycleview-v7包就行了
acvitity_main.xml布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.contentprovide.liuliu.recycle_3.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="以下是RecycleView" /> <android.support.v7.widget.RecyclerView android:id="@+id/myRecycle" android:layout_width="wrap_content" android:layout_height="200dp"></android.support.v7.widget.RecyclerView></LinearLayout>
java代碼實現:
package com.contentprovide.liuliu.recycle_3;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/*** 把RecycleView添加進布局檔案中* */public class MainActivity extends AppCompatActivity { // 聲明一個RecycleView變數 RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// 把自訂的RecycleView變數和activity_main.xml中的id綁定 recyclerView = (RecyclerView) findViewById(R.id.myRecycle);// 設定RecycleView的布局方式,這裡是線性布局,預設垂直 recyclerView.setLayoutManager(new LinearLayoutManager(this));// 執行個體化自訂配接器 MyAdapter myAdapter = new MyAdapter();// 把適配器添加到RecycleView中 recyclerView.setAdapter(myAdapter); } // 自訂類繼承RecycleView.Adapter類作為資料配接器 class MyAdapter extends RecyclerView.Adapter { // 在適配器當中自訂內部類,其中的子物件用於呈現資料 class Myholder extends RecyclerView.ViewHolder { TextView t; public Myholder(View view) { super(view);// 執行個體化自訂對象 t = (TextView) view; } }// 以下是系統自動產生的三個方法 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Myholder myholder = new Myholder(new TextView(parent.getContext())); return myholder; } // 對控制項賦值 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Myholder mm = (Myholder) holder; mm.t.setText("item" + position); } @Override public int getItemCount() { return 10; } }}
實現效果:
可以看到對RecylerView的設定過程,比ListView要複雜一些,這也是RecylerView高度解耦的表現,雖然代碼抒寫上有點複雜,但它的擴充性是極高的。在瞭解了RecyclerView的一些控制之後,緊接著來看看它的Adapter的寫法,RecyclerView的Adapter與ListView的Adapter還是有點區別的,RecyclerView.Adapter,需要實現3個方法:①onCreateViewHolder() 這個方法主要產生為每個Item inflater出一個View,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中,然後我們面向的是ViewHolder這個執行個體,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。②onBindViewHolder() 這個方法主要用於適配渲染資料到View中。方法提供給你了一個viewHolder,而不是原來的convertView。③getItemCount() 這個方法就類似於BaseAdapter的getCount方法了,即總共有多少個條目。
使用資源檔自訂欄表項
好多時候每個清單項目我們需要展示更多的內容,並且要讓它更美觀,這個時候就需要自訂欄表項,需要哪種效果,自己就在一個新的xml資源檔中定義
例如實現以下效果:
步驟:
自訂欄表項布局檔案list.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/te1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#e20707" android:textSize="30dp" /> <TextView android:id="@+id/te2" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#0fec1a" android:textSize="15dp" /></LinearLayout>
和上面一樣的activity_main.xml檔案:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.contentprovide.liuliu.recycle_4.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="展示效果如下:" /> <android.support.v7.widget.RecyclerView android:id="@+id/myrecycleView" android:layout_width="wrap_content" android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView></LinearLayout>
Java代碼實現:
package com.contentprovide.liuliu.recycle_4;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; String s_te1[] = {"內容一", "內容一", "內容一"}; String s_te2[] = {"內容二", "內容二", "內容二"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.myrecycleView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); MyAdapter myAdapter = new MyAdapter(); recyclerView.setAdapter(myAdapter); } class MyAdapter extends RecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyHolder myHolder = new MyHolder(LayoutInflater.from(getApplicationContext()).inflate(R.layout.list, null));//引入自訂欄表項的資源檔 return myHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MyHolder mm = (MyHolder) holder;// 將資料對應到控制項中 mm.te1.setText(s_te1[position]); mm.te2.setText(s_te2[position]); } @Override public int getItemCount() { return s_te1.length; } class MyHolder extends RecyclerView.ViewHolder { TextView te1, te2; public MyHolder(View itemView) { super(itemView);// 執行個體化子物件,把對象和清單項目布局檔案中的id綁定 te1 = itemView.findViewById(R.id.te1); te2 = itemView.findViewById(R.id.te2); } } }}
到這裡RecycleView的基本使用就搞定了,下面加一些更加靈活的使用,例如:增加分隔線,通過幾行代碼的改變轉換成GridView效果。這裡就可以體現RecycleView比ListView更加靈活的地方了
將線性布局的方向由垂直改成水平,實現如下效果:
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
可以看到不止實現了水平的布局,而且可以水平滾動,這種效果在ListView中是不支援的
將線性布局改成GridView布局
recyclerView.setLayoutManager(new GridLayoutManager(this,4));
網格布局預設狀態下是垂直的,如果是垂直的那麼第二個參數代表有多少列,如果是水平布局那麼第二個參數代表的是有多少行
轉換成水平的布局:
recyclerView.setLayoutManager(new GridLayoutManager(this,4,GridLayoutManager.HORIZONTAL,false));
添加系統內建的分割線:
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
自訂分割線比較繁瑣,有興趣可以看看這個大神的
http://blog.csdn.net/dmk877/article/details/50816933
Android開發RecycleView的使用全解