RecyclerView使用探索1--了解及使用
前言
目前的項(xiàng)目中,基本已經(jīng)使用 RecyclerView 全面替換了ListView和GridView。確實(shí),使用RecyclerView更加靈活,功能也更加強(qiáng)大。
最近也嘗試把學(xué)習(xí)到的知識(shí)點(diǎn)花時(shí)間整理歸納,作為對(duì)自己學(xué)習(xí)的總結(jié),也可以在復(fù)習(xí)的過(guò)程中查漏補(bǔ)缺,完善自己的知識(shí)網(wǎng)絡(luò)。借此將RecyclerView作為總結(jié)系列的開(kāi)頭,希望自己能夠堅(jiān)持下去。
本章節(jié)內(nèi)容如下:(星號(hào)代表額外補(bǔ)充內(nèi)容)
1.RecyclerView簡(jiǎn)介和使用準(zhǔn)備
2.RecyclerView的入門使用
3*.簡(jiǎn)單好用的小控件:CardView
4.通過(guò)RecyclerView+CardView的簡(jiǎn)單使用實(shí)現(xiàn)一個(gè)小案例:
一.RecyclerView簡(jiǎn)介和使用準(zhǔn)備
關(guān)于RecyclerView的簡(jiǎn)介,谷歌官方文檔說(shuō)明非常簡(jiǎn)潔:
A flexible view for providing a limited window into a large data set.一種為有限個(gè)數(shù)的數(shù)據(jù)集提供有限窗口的靈活的View對(duì)于Android應(yīng)用而言,ListView和GridView是展示數(shù)據(jù)集合的選擇,但是RecyclerView比前兩者更加先進(jìn)和靈活,
目前越來(lái)越多的Android應(yīng)用都在優(yōu)先選擇RecyclerView代替之前的ListView和GridView。
而使用RecyclerView的好處究竟在哪里呢?我們?cè)诮酉聛?lái)的demo中一點(diǎn)一點(diǎn)接觸并學(xué)習(xí)使用它,慢慢感受相對(duì)于ListView和GridView,它的簡(jiǎn)單和靈活性。
RecyclerView使用方式
在AndroidStudio項(xiàng)目app的Gradle文件中添加依賴:
//注意:將25.0.1換成你目錄下v7包一樣的版本號(hào) compile 'com.android.support:recyclerview-v7:25.0.1'需要注意的一點(diǎn)是,我們可以看到,RecyclerView是V7包下的控件,因此我們需要將RecyclerViewd的版本和V7包的版本一致,否則編譯會(huì)不通過(guò)。
添加完依賴并同步之后,我們就可以直接使用RecyclerView了。
二.RecyclerView的入門使用
1.xml文件中配置
添加依賴成功后,我們?cè)陧?xiàng)目中的activity_main.xml中直接就可以添加RecycleView控件了:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.mei_husky.samplerv.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recycleView"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>ok,非常簡(jiǎn)單,這樣我就可以在xml對(duì)應(yīng)的MainActivity.java文件中對(duì)控件進(jìn)行處理了。
2.Activity中的使用
在Activity中代碼如下:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initDatas();initRecyclerView();}//給數(shù)據(jù)源賦值private void initDatas() {for (int i=0;i<50;i++){datas.add("這是第i條條目,i=="+i);}}private ArrayList<String> datas=new ArrayList<>();/*** 初始化recyclerview*/private void initRecyclerView() {RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycleView); //初始化控件MyRvAdapter adapter= new MyRvAdapter(this,datas);//創(chuàng)建適配器adapterrecyclerView.setAdapter(adapter); //給控件配置adpter//配置布局LinearLayoutManager manager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);recyclerView.setLayoutManager(manager);} }OK,代碼非常簡(jiǎn)單,我們僅僅在Activity中初始化了一個(gè)list集合,里面是50條語(yǔ)句,用來(lái)展示在RecyclerView的item上面;然后配置RecyclerView就可以了。
和ListView很相似,初始化配置RecyclerView也是創(chuàng)建了一個(gè)Adapter適配器,然后將Adapter的實(shí)例化對(duì)象設(shè)置給RecyclerView就可以了。
之后我們要思考的問(wèn)題是,RecyclerView是可以代替ListView,GridView,甚至可以直接達(dá)到瀑布流的效果,那么它是怎么知道我們要它成為哪種布局呢?答案是:
配置LayoutManager
如果我們想要它成為listview一樣,我們就給它設(shè)置一個(gè)LinearLayoutManager:
//切換listView樣式,三個(gè)參數(shù)分別為(上下文對(duì)象,垂直還是水平布局,是否倒序排列) LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recycleView.setLayoutManager(linearLayoutManager);如果我們要讓它是流布局,那么就給它設(shè)置一個(gè)GridLayoutManager;
//切換gridView樣式,三個(gè)參數(shù)分別為(上下文對(duì)象,垂直還是水平布局,是否倒序排列) GridLayoutManager gridLayoutManager=new GridLayoutManager(ctx,2,GridLayoutManager.VERTICAL,false); recycleView.setLayoutManager(gridLayoutManager);如果我們要讓它做成瀑布流的效果,那么就給它設(shè)置StaggeredGridLayoutManager;
//切換瀑布流樣式,2個(gè)參數(shù)分別為(瀑布流分幾列,垂直還是水平布局) StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); recycleView.setLayoutManager(staggeredGridLayoutManager);設(shè)置布局參數(shù)是非常簡(jiǎn)單而且有效的,我們甚至可以隨意將某種布局通過(guò)代碼轉(zhuǎn)換為另外一種布局!
假如有這樣一種需求:用戶通過(guò)界面的交互可以任意切換布局樣式,如果是傳統(tǒng)的listView或者GridView,想要通過(guò)代碼的邏輯互相轉(zhuǎn)換時(shí)非常麻煩的,而我們使用RecycleView,我們就可以這樣:
public void onClick(View view) {switch (view.getId()) {case R.id.list://切換listView樣式LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);recycleView.setLayoutManager(linearLayoutManager);break;case R.id.grid://切換gridView樣式GridLayoutManager gridLayoutManager=new GridLayoutManager(ctx,2,GridLayoutManager.VERTICAL,false);recycleView.setLayoutManager(gridLayoutManager);break;case R.id.stream://切換瀑布流樣式StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);recycleView.setLayoutManager(staggeredGridLayoutManager);break;} }咳咳,扯遠(yuǎn)了,說(shuō)回來(lái)。
看樣子我們配置好了,那么我們可以直接運(yùn)行了嗎?顯然不行,因?yàn)槲覀冞€不知道MyAdapter究竟是什么呢,接下來(lái)也是RecyclerView入門學(xué)習(xí)的一個(gè)難點(diǎn),就是適配器的配置。
3.Adapter和ViewHolder
先上Adapter的代碼:
public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.MyViewHolder> {private Context ctx;private ArrayList<String> datas;//構(gòu)造方法public MyRvAdapter(Context ctx, ArrayList<String> datas) {this.ctx = ctx;this.datas = datas;}//創(chuàng)建ViewHolder,并將item的界面和ViewHolder綁定@Overridepublic MyRvAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new MyViewHolder(LayoutInflater.from(ctx).inflate(R.layout.item_rv,parent,false));}//將控件和數(shù)據(jù)綁定@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position) {holder.tv.setText(datas.get(position));holder.tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"第X個(gè)item被點(diǎn)了,X="+position,Toast.LENGTH_SHORT).show();}});}//條目的數(shù)量@Overridepublic int getItemCount() {return datas.size();}//自定義的ViewHolder,持有每個(gè)Item的的所有界面元素class MyViewHolder extends RecyclerView.ViewHolder{public MyViewHolder(View itemView) {super(itemView);tv= (TextView) itemView.findViewById(R.id.tv);}public TextView tv;} }如果是第一次接觸RecyclerView的同學(xué),我大膽的揣測(cè)一下此時(shí)的狀態(tài)應(yīng)該是這樣的:
不過(guò)不用擔(dān)心,因?yàn)榇_實(shí),這個(gè)自定義Adapter和我們?cè)谑褂胠istview的時(shí)候還是有點(diǎn)不太一樣的,大多數(shù)人第一次接觸同樣有點(diǎn)暈,等說(shuō)明了每個(gè)方法的作用,再實(shí)際操作兩回,基本就沒(méi)什么問(wèn)題了。
注意:以下的內(nèi)容很重要!!!
首先這邊我們需要繼承RecyclerView.Adaper類,然后實(shí)現(xiàn)兩個(gè)重要的方法onBindViewHodler()以及onCreateViewHolder()。
onCreateViewHolder():我們可以理解為這是listView中的convertView,當(dāng)創(chuàng)建新的item時(shí)需要我們引入的布局。我們通過(guò)inflate方法將獲得的布局作為參數(shù)傳給ViewHolder的構(gòu)造器,將findViewById的方法全部交給ViewHolder去處理,這樣我們處理任何控件時(shí),只需要操作holder就可以了。
我們的item布局界面(R.layout.item_rv)很簡(jiǎn)單,我們僅僅展示一條TextView,上面顯示信息就可以了:
<?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="match_parent"><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="60dp"android:textSize="16sp"android:layout_margin="10dp"android:textColor="#1e1e1e"android:gravity="center"/></LinearLayout>onBindViewHodler():這個(gè)就很簡(jiǎn)單了,我們?cè)谶@里需要處理的僅僅是每條item中的所有界面元素和數(shù)據(jù)的綁定,在demo中我們將datas中對(duì)應(yīng)的字符串交給holder中的TextView展示即可,當(dāng)然為了讓我們看到綁定的結(jié)果,我們?cè)O(shè)置,textView的點(diǎn)擊監(jiān)聽(tīng),彈出一條Toast。
getItemCount():也是最好理解的一個(gè)方法,通過(guò)返回值我們告訴RecyclerView需要展示多少個(gè)item。
4.大功告成?
好了,現(xiàn)在萬(wàn)事俱備,我們需要做的僅僅是打開(kāi)手機(jī)收獲我們的結(jié)果了:
demo展示效果如下:
很好,我們花費(fèi)了很長(zhǎng)時(shí)間,終于把效果實(shí)現(xiàn)了!撒花!
然而
原因很簡(jiǎn)單,我們花費(fèi)大量的時(shí)間成本,學(xué)習(xí)達(dá)成的效果顯然和我們以往使用的ListView效果一樣,那么我們學(xué)習(xí)它的意義何在?這顯然不符合程序員三大美德:懶惰 缺乏耐性 和傲慢 ( laziness,Impatience.and Hubris)
當(dāng)然是有意義的。不過(guò)這需要我們慢慢去了解和感受,因?yàn)楹?jiǎn)單的需求是體現(xiàn)不出來(lái)其實(shí)用和簡(jiǎn)單性的,當(dāng)需求隨著時(shí)間的堆積而一次次的變得復(fù)雜,終究我們會(huì)有一天發(fā)現(xiàn),RecyclerView實(shí)在太好用了!
三*.簡(jiǎn)單好用的小控件:CardView
1.配置方式
在AndroidStudio項(xiàng)目app的Gradle文件中添加依賴:
//注意:將25.0.1換成你目錄下v7包一樣的版本號(hào) compile 'com.android.support:cardview-v7:25.0.1'和RecyclerView一樣,我們需要將CardView的版本和V7包的版本一致,否則編譯會(huì)不通過(guò)。
添加完依賴并同步之后,我們就可以直接使用CardView了。
2.xml配置
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"android:layout_width="match_parent"android:layout_height="wrap_content"><android.support.v7.widget.CardViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"app:cardBackgroundColor="@color/blue"app:cardCornerRadius="16dp"app:cardElevation="16dp"><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:gravity="center"android:textSize="20sp" /></android.support.v7.widget.CardView> </LinearLayout>很簡(jiǎn)單,CardView本身就是extends FrameLayout的,使用方式和FrameLayou基本沒(méi)有區(qū)別。
3.基本屬性
基本屬性如下,最常用的也就是前兩個(gè)
app:cardBackgroundColor 這是設(shè)置背景顏色
app:cardCornerRadius 這是設(shè)置圓角大小
app:cardElevation這是設(shè)置z軸的陰影
app:cardMaxElevation這是設(shè)置z軸的最大高度值
app:cardUseCompatPadding是否使用CompatPadding
app:cardPreventCornerOverlap是否使用PreventCornerOverlap
app:contentPadding 設(shè)置內(nèi)容的padding
app:contentPaddingLeft 設(shè)置內(nèi)容的左padding
app:contentPaddingTop 設(shè)置內(nèi)容的上padding
app:contentPaddingRight 設(shè)置內(nèi)容的右padding
app:contentPaddingBottom 設(shè)置內(nèi)容的底padding
四, 練手小案例
接下來(lái)做一個(gè)好玩的小案例來(lái)鞏固RecyclerView的知識(shí),好友印象
[好友印象]
案例效果如下:
界面效果還不錯(cuò),依靠同樣是support v7包中的CardView,顧名思義,就是類似于卡片一樣的控件,簡(jiǎn)約而又美觀,實(shí)在是開(kāi)發(fā)個(gè)人應(yīng)用時(shí)的一大神器。
而卡片的刪除效果則是RecyclerView自帶的效果,不僅僅是刪除的效果,RecyclerView還自帶很多其他的動(dòng)畫(huà)效果,相比之下確實(shí)比GridView好用許多。
【好友印象】源碼在此,戳我!
總結(jié)
以上是生活随笔為你收集整理的RecyclerView使用探索1--了解及使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是 Benchmarks?
- 下一篇: SAP 创建利润中心标准层次