各位看官們,大家好,上一回中咱們說的是Android中UI控件之ListView優化的例子,這一回咱們說的例子是UI控件之RecyclerView。閑話休提,言歸正轉。讓我們一起Talk Android吧!
看官們,我們在前面章回中介紹了ListView組件,今天我們將介紹ListView組件的升級版:RecyclerView組件。之所以叫它升級版本是因為它是官方推出的組件,而且官方推薦使用它來替代ListView組件。它雖然和ListView一樣是用來在有限的屏幕空間內滾動顯示大量數據,但是它比ListView的顯示效率高,因為它每次只創建一個屏幕可以顯示的列表,當滑動屏幕時,它自動銷毀從屏幕中消失的列表,然后再創建新的列表顯示到屏幕中,這樣循環往復。細看一下這操作就和它的名字一樣,如果和數據結構對比的話,就有點循環隊列的意思。接下來我們通過文本結合代碼的方式來介紹如何使用RecyclerView組件。
- 1.在布局文件中添加RecyclerView組件。通常是在Activity或者Fragment的布局文件中添加。添加時需要使用完整包名,因為它是support庫中的東西。代碼如下:
<android.support.v7.widget.RecyclerViewandroid:id="@+id/id_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
- 2.在代碼中加載RecyclerView組件的布局。通常是在Activity的onCreate方法或者Fragment的onCreateView方法中加載它的布局,這和普通組件的加載方法相同:
//獲取RecyclerView控件,該控件定義于上面的布局中mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
- 3.設置LayouManager。使用該組件的setLayoutManager方法。代碼如下:
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
- 4.創建適配器(Adapter)對象,并且為RecyclerView設置Adapter。具體的代碼如下:
//把Recylerview和adapter關聯起來,CustomAdapter稍后介紹mRecyclerView.setAdapter(new CustomAdapter(mData));
簡單起見,在這里的把mData定義成一個數組,在實際中可以依據項目需求來定義。但是不管如何定義,它都要和適配器的構造函數保持一致,不然沒有辦法把數據傳遞給適配器。此外,這也是可以進行擴展的地方,我們將在后面章回中介紹,下面是與mData相關的代碼:
private String[] mData = new String[50];for(int i=0; i<50;++i){mData[i]= "This is item "+(i+1);}
接下來該適配器出場了,代碼中的CustomeAdapter類是RecyclerView.Adapter的子類,也就是說RecyclerView已經把適配器的規范定義好了,我們只需要按照規范去實現就可以,那么有哪些規范呢?規范主要是實現一個ViewHolder(這個不陌生吧),并且重寫onCreateViewHolder()方法,onBindViewHolder()方法和getItemCount。
- onCreateViewHolder方法主要是加載布局文件和創建ViewHolder;這里的布局文件指Recycler包含的布局,也就是顯示到屏幕中的布局。
- onBindViewHolder方法主要是為RecyclerView包含的布局中各個控件添加數據,進而實現數據和視圖的連接操作(也可以理解為更新數據)。
- getItemCount方法主要是獲取RecyclerView中條目的數量,這個數量是指所有數據的數量,而不是在屏幕上顯示數據的數量。
下面是代碼,不過首先要創建一個布局文件,用來顯示RecyclerView中每行或者每列顯示的內容,至于布局中顯示哪些的內容可以依據項目需求來定。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/id_recy_view_item_text"android:layout_width="wrap_content"android:layout_height="18dp"/>
</LinearLayout>
我們創建了一個叫recycler_view_layout
的布局文件,簡單起見,我們只放了一個文本組件,用來顯示一行文本內容。布局創建好以后,接下就是重頭戲:創建適配器。
//注意適配器是泛型
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>{ //自己定義的數據容器,這里使用簡單的字符串數組,
//可以是list或者其它容器,容器中的數據類型可以自己定義private String[] mStrings; //定義ViewHolder,繼續自RecyclerView的ViewHolderpublic static class CustomViewHolder extends RecyclerView.ViewHolder{//RecyclerView中每一個子項包含的組件,也就是RecyclerView每行或者每列顯示的內容public TextView tv; //ViewHolder就是一個數據容器public CustomViewHolder(View v){super(v);//獲取RecyclerView中的組件tv =(TextView) v.findViewById(R.id.id_recy_view_item_text);}public TextView getTextView(){return tv;}}//重寫適配器的構造器,目的是把數據傳入到適配器中public CustomAdapter(String[] strings){if(strings != null) {mStrings = strings;}}@Overridepublic CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//獲取View對象,這里的布局就是剛才創建的,看布局id就能明白。//它用來顯示Recylerview中具體的列表項View view = LayoutInflater.from(parent.getContext()).inflate (R.layout.recycler_view_layout,parent,false);//創建viewHoldCustomViewHolder customViewHolder = new CustomViewHolder(view); //返回ViewHolderreturn customViewHolder; }@Overridepublic void onBindViewHolder(CustomViewHolder holder, int position) {//通過position參數獲取列表項在Recylerview中的位置,然后更新該位置的數據holder.getTextView().setText(mStrings[position]); }@Overridepublic int getItemCount() {//這個長度比較重要,如果為0,那么recylerview中不會有任何數據顯示。return mStrings.length;}
}
上面的代碼,完全是按照RecyclerView.Adapter的規范來寫的,這和ListView不一樣,我們可以自己擴展。另外,我們還創建了一個布局文件,用來顯示RecyclerView中每一項的內容,該布局不像ListView一樣可以使用系統提供的,因為系統沒有提供,只能自己定義。
此外,RecyclerView組件是support庫中的東西,它不在SDK中,使用該組件時需要添加支持庫,可以手動修改app目錄下的build.gradle文件,在dependencies中添加:
compile 'com.android.support:recyclerview-v7:25.1.0'
或者修改項目配置,AST會自動修改gradle
文件。修改步驟: AST Menu->File->ProjectStructure->app
.
不過添加的Recyclerview
組件要和support
庫的版本一致,不然會出現不兼容的問題。我使用的版本如下:
compile 'com.android.support:appcompat-v7:25.1.0'compile 'com.android.support:recyclerview-v7:25.1.0'
下面是程序運行的結果,請參考:

各位看官,關于Android中UI控件之RecyclerView基礎的例子咱們就介紹到這里,欲知后面還有什么例子,且聽下回分解!