RecyclerView使用介紹


http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html

編輯推薦:稀土掘金,這是一個針對技術(shù)開發(fā)者的一個應用,你可以在掘金上獲取最新最優(yōu)質(zhì)的技術(shù)干貨,不僅僅是Android知識、前端、后端以至于產(chǎn)品和設(shè)計都有涉獵,想成為全棧工程師的朋友不要錯過!

這篇文章是根據(jù)官網(wǎng)的一篇文章(這里)寫的,不過作者增加了一些自己的理解,我十分推崇這種方式,而不是死板的翻譯官網(wǎng)的文檔,國內(nèi)技術(shù)文章翻譯的最差的地方在于:翻譯出來的句子還保留著英語的語序。

RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。接下來通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView.

介紹

RecyclerView與ListView原理是類似的:都是僅僅維護少量的View并且可以展示大量的數(shù)據(jù)集。RecyclerView用以下兩種方式簡化了數(shù)據(jù)的展示和處理:

使用LayoutManager來確定每一個item的排列方式。

為增加和刪除項目提供默認的動畫效果。

你也可以定義你自己的LayoutManager和添加刪除動畫,RecyclerView項目結(jié)構(gòu)如下:

Adapter:使用RecyclerView之前,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數(shù)據(jù)與每一個item的界面進行綁定。

LayoutManager:用來確定每一個item如何進行排列擺放,何時展示和隱藏?;厥栈蛑赜靡粋€View的時候,LayoutManager會向適配器請求新的數(shù)據(jù)來替換舊的數(shù)據(jù),這種機制避免了創(chuàng)建過多的View和頻繁的調(diào)用findViewById方法(與ListView原理類似)。

目前SDK中提供了三種自帶的LayoutManager:

LinearLayoutManager

GridLayoutManager

StaggeredGridLayoutManager

第一節(jié)、簡單的RecyclerView使用方法

本節(jié)所示示例是一個最簡單的使用方法,在接下來幾節(jié)中將會介紹更多RecyclerView的別的一些屌爆的用法。作者用的環(huán)境是Android Studio 0.8.6。

1、添加依賴

在AS的build.gradle中添加依賴,然后同步一下就可以引入依賴包:

dependencies{

...

compile'com.android.support:recyclerview-v7:21.0.+'

}

2、編寫代碼

添加完依賴之后,就開始寫代碼了,與ListView用法類似,也是先在xml布局文件中創(chuàng)建一個RecyclerView的布局:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:id="@+id/my_recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scrollbars="vertical"/>

創(chuàng)建完布局之后在MainActivity中獲取這個RecyclerView,并聲明LayoutManager與Adapter,代碼如下:

mRecyclerView=(RecyclerView)findViewById(R.id.my_recycler_view);

//創(chuàng)建默認的線性LayoutManager

mLayoutManager=newLinearLayoutManager(this);

mRecyclerView.setLayoutManager(mLayoutManager);

//如果可以確定每個item的高度是固定的,設(shè)置這個選項可以提高性能

mRecyclerView.setHasFixedSize(true);

//創(chuàng)建并設(shè)置Adapter

mAdapter=newMyAdapter(getDummyDatas());

mRecyclerView.setAdapter(mAdapter);

接下來的問題就是Adapter的創(chuàng)建:

publicclassMyAdapterextendsRecyclerView.Adapter{

publicString[]datas=null;

publicMyAdapter(String[]datas){

this.datas=datas;

}

//創(chuàng)建新View,被LayoutManager所調(diào)用

@Override

publicViewHolderonCreateViewHolder(ViewGroupviewGroup,intviewType){

Viewview=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);

ViewHoldervh=newViewHolder(view);

returnvh;

}

//將數(shù)據(jù)與界面進行綁定的操作

@Override

publicvoidonBindViewHolder(ViewHolderviewHolder,intposition){

viewHolder.mTextView.setText(datas[position]);

}

//獲取數(shù)據(jù)的數(shù)量

@Override

publicintgetItemCount(){

returndatas.length;

}

//自定義的ViewHolder,持有每個Item的的所有界面元素

publicstaticclassViewHolderextendsRecyclerView.ViewHolder{

publicTextViewmTextView;

publicViewHolder(Viewview){

super(view);

mTextView=(TextView)view.findViewById(R.id.text);

}

}

}

3、運行

寫完這些代碼這個例子既可以跑起來了。從例子也可以看出來,RecyclerView的用法并不比ListView復雜,反而更靈活好用,它將數(shù)據(jù)、排列方式、數(shù)據(jù)的展示方式都分割開來,因此可定制型,自定義的形式也非常多,非常靈活。

橫向布局

如果想要一個橫向的List只要設(shè)置LinearLayoutManager如下就行,注意要聲明mLayoutManager的類型是LinearLayoutManager而不是父類LayoutManager:

mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

Grid布局

如果想要一個Grid布局的列表,只要聲明LayoutManager為GridLayoutManager即可:

mLayoutManager=newGridLayoutManager(context,columNum);

mRecyclerView.setLayoutManager(mLayoutManager);

注意,在Grid布局中也可以設(shè)置列表的Orientation屬性,來實現(xiàn)橫向和縱向的Grid布局。

瀑布流布局

瀑布流就使用StaggeredGridLayoutManager吧,具體方法與上面類似,就不做介紹啦。

總結(jié)

本節(jié)介紹的是一個最最簡單的RecyclerView的使用方法,后面將介紹一些更高級的用法。

第二節(jié)、RecyclerView的高級方法

當使用了一段時間的RecyclerView,發(fā)現(xiàn)為其每一項添加點擊事件并沒有ListView那么輕松,像ListView直接加個OnItemClickListener就行了。實際上我們不要把RecyclerView當做ListView的一個升級版,希望大家把他看做一個容器,同時里面包含了很多不同的Item,它們可以以不同方式排列組合,非常靈活,點擊方式你可以按照你自己的意愿進行實現(xiàn)。

本節(jié)主要講解如何為RecyclerView添加點擊事件, 并簡單介紹如何進行Item增加刪除。

添加點擊事件

上一節(jié)中我們講了如何使用RecyclerView的Adpater,其實我們會發(fā)現(xiàn),Adapter是添加點擊事件一個很好的地方,里面是構(gòu)造布局等View的主要場所,也是數(shù)據(jù)和布局進行綁定的地方。首先我們在Adapter中創(chuàng)建一個實現(xiàn)點擊接口,其中view是點擊的Item,data是我們的數(shù)據(jù),因為我們想知道我點擊的區(qū)域部分的數(shù)據(jù)是什么,以便我下一步進行操作:

publicstaticinterfaceOnRecyclerViewItemClickListener{

voidonItemClick(Viewview,DataModeldata);

}

定義完接口,添加接口和設(shè)置Adapter接口的方法:

privateOnRecyclerViewItemClickListenermOnItemClickListener=null;

publicvoidsetOnItemClickListener(OnRecyclerViewItemClickListenerlistener){

this.mOnItemClickListener=listener;

}

那么這個接口用在什么地方呢?如下代碼所示,我們?yōu)锳dapter實現(xiàn)OnClickListener方法:

publicclassMyAdapterextendsRecyclerView.AdapterimplementsView.OnClickListener{

@Override

publicViewHolderonCreateViewHolder(ViewGroupviewGroup,finalinti){

Viewview=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);

ViewHoldervh=newViewHolder(view);

//將創(chuàng)建的View注冊點擊事件

view.setOnClickListener(this);

returnvh;

}

@Override

publicvoidonBindViewHolder(ViewHolderviewHolder,finalinti){

viewHolder.mTextView.setText(datas.get(i).title);

//將數(shù)據(jù)保存在itemView的Tag中,以便點擊時進行獲取

viewHolder.itemView.setTag(datas.get(i));

}

...

@Override

publicvoidonClick(Viewv){

if(mOnItemClickListener!=null){

//注意這里使用getTag方法獲取數(shù)據(jù)

mOnItemClickListener.onItemClick(v,(DataModel)v.getTag());

}

}

...

}

做完這些事情,我們就可以在Activity或其他地方為RecyclerView添加項目點擊事件了,如在MainActivity中:

mAdapter=newMyAdapter(getDummyDatas());

mRecyclerView.setAdapter(mAdapter);

mAdapter.setOnItemClickListener(newMyAdapter.OnRecyclerViewItemClickListener(){

@Override

publicvoidonItemClick(Viewview,DataModeldata){

//DO?your?fucking?bussiness?here!

}

});

完成了以上代碼就可以為RecyclerView添加項目點擊事件了,下面我們來看看RecyclerView如何添加和刪除數(shù)據(jù)并在界面上顯示。

添加刪除數(shù)據(jù)

以前在ListView當中,我們只要修改后數(shù)據(jù)用Adapter的notifyDatasetChange一下就可以更新界面。然而在RecyclerView中還有一些更高級的用法:

添加數(shù)據(jù):

publicvoidaddItem(DataModelcontent,intposition){

datas.add(position,content);

notifyItemInserted(position);//Attention!

}

刪除數(shù)據(jù):

publicvoidremoveItem(DataModelmodel){

intposition=datas.indexOf(model);

datas.remove(position);

notifyItemRemoved(position);//Attention!

}

值得注意的是RecyclerView的添加刪除都是有默認的動畫效果的,如果沒有效果可以添加如下代碼:

mRecyclerView.setItemAnimator(newDefaultItemAnimator());

當然啦你也可以自己定義你自己的Animator,等我研究明白了也來講一講如何自定義這些效果~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,292評論 25 708
  • RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替...
    Jason_andy閱讀 1,158評論 0 0
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,886評論 22 665
  • 這篇文章分三個部分,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,414評論 0 27
  • 我們80后的童年,是在廣東的一個農(nóng)場里度過的。農(nóng)場很大,大到從我出生一直到離開前都未能走出過它的世界。農(nóng)場種植著各...
    言惠華閱讀 328評論 0 0