RecyclerView使用探索1--了解及使用
前言
目前的項目中,基本已經(jīng)使用 RecyclerView 全面替換了ListView和GridView。確實,使用RecyclerView更加靈活,功能也更加強大。
最近也嘗試把學(xué)習(xí)到的知識點花時間整理歸納,作為對自己學(xué)習(xí)的總結(jié),也可以在復(fù)習(xí)的過程中查漏補缺,完善自己的知識網(wǎng)絡(luò)。借此將RecyclerView作為總結(jié)系列的開頭,希望自己能夠堅持下去。
本章節(jié)內(nèi)容如下:(星號代表額外補充內(nèi)容)
1.RecyclerView簡介和使用準(zhǔn)備
2.RecyclerView的入門使用
3*.簡單好用的小控件:CardView
4.通過RecyclerView+CardView的簡單使用實現(xiàn)一個小案例:
一.RecyclerView簡介和使用準(zhǔn)備
關(guān)于RecyclerView的簡介,谷歌官方文檔說明非常簡潔:
A flexible view for providing a limited window into a large data set.一種為有限個數(shù)的數(shù)據(jù)集提供有限窗口的靈活的View對于Android應(yīng)用而言,ListView和GridView是展示數(shù)據(jù)集合的選擇,但是RecyclerView比前兩者更加先進(jìn)和靈活,
目前越來越多的Android應(yīng)用都在優(yōu)先選擇RecyclerView代替之前的ListView和GridView。
而使用RecyclerView的好處究竟在哪里呢?我們在接下來的demo中一點一點接觸并學(xué)習(xí)使用它,慢慢感受相對于ListView和GridView,它的簡單和靈活性。
RecyclerView使用方式
在AndroidStudio項目app的Gradle文件中添加依賴:
//注意:將25.0.1換成你目錄下v7包一樣的版本號 compile 'com.android.support:recyclerview-v7:25.0.1'需要注意的一點是,我們可以看到,RecyclerView是V7包下的控件,因此我們需要將RecyclerViewd的版本和V7包的版本一致,否則編譯會不通過。
添加完依賴并同步之后,我們就可以直接使用RecyclerView了。
二.RecyclerView的入門使用
1.xml文件中配置
添加依賴成功后,我們在項目中的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,非常簡單,這樣我就可以在xml對應(yīng)的MainActivity.java文件中對控件進(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,代碼非常簡單,我們僅僅在Activity中初始化了一個list集合,里面是50條語句,用來展示在RecyclerView的item上面;然后配置RecyclerView就可以了。
和ListView很相似,初始化配置RecyclerView也是創(chuàng)建了一個Adapter適配器,然后將Adapter的實例化對象設(shè)置給RecyclerView就可以了。
之后我們要思考的問題是,RecyclerView是可以代替ListView,GridView,甚至可以直接達(dá)到瀑布流的效果,那么它是怎么知道我們要它成為哪種布局呢?答案是:
配置LayoutManager
如果我們想要它成為listview一樣,我們就給它設(shè)置一個LinearLayoutManager:
//切換listView樣式,三個參數(shù)分別為(上下文對象,垂直還是水平布局,是否倒序排列) LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recycleView.setLayoutManager(linearLayoutManager);如果我們要讓它是流布局,那么就給它設(shè)置一個GridLayoutManager;
//切換gridView樣式,三個參數(shù)分別為(上下文對象,垂直還是水平布局,是否倒序排列) GridLayoutManager gridLayoutManager=new GridLayoutManager(ctx,2,GridLayoutManager.VERTICAL,false); recycleView.setLayoutManager(gridLayoutManager);如果我們要讓它做成瀑布流的效果,那么就給它設(shè)置StaggeredGridLayoutManager;
//切換瀑布流樣式,2個參數(shù)分別為(瀑布流分幾列,垂直還是水平布局) StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); recycleView.setLayoutManager(staggeredGridLayoutManager);設(shè)置布局參數(shù)是非常簡單而且有效的,我們甚至可以隨意將某種布局通過代碼轉(zhuǎn)換為另外一種布局!
假如有這樣一種需求:用戶通過界面的交互可以任意切換布局樣式,如果是傳統(tǒng)的listView或者GridView,想要通過代碼的邏輯互相轉(zhuǎn)換時非常麻煩的,而我們使用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)了,說回來。
看樣子我們配置好了,那么我們可以直接運行了嗎?顯然不行,因為我們還不知道MyAdapter究竟是什么呢,接下來也是RecyclerView入門學(xué)習(xí)的一個難點,就是適配器的配置。
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個item被點了,X="+position,Toast.LENGTH_SHORT).show();}});}//條目的數(shù)量@Overridepublic int getItemCount() {return datas.size();}//自定義的ViewHolder,持有每個Item的的所有界面元素class MyViewHolder extends RecyclerView.ViewHolder{public MyViewHolder(View itemView) {super(itemView);tv= (TextView) itemView.findViewById(R.id.tv);}public TextView tv;} }如果是第一次接觸RecyclerView的同學(xué),我大膽的揣測一下此時的狀態(tài)應(yīng)該是這樣的:
不過不用擔(dān)心,因為確實,這個自定義Adapter和我們在使用listview的時候還是有點不太一樣的,大多數(shù)人第一次接觸同樣有點暈,等說明了每個方法的作用,再實際操作兩回,基本就沒什么問題了。
注意:以下的內(nèi)容很重要!!!
首先這邊我們需要繼承RecyclerView.Adaper類,然后實現(xiàn)兩個重要的方法onBindViewHodler()以及onCreateViewHolder()。
onCreateViewHolder():我們可以理解為這是listView中的convertView,當(dāng)創(chuàng)建新的item時需要我們引入的布局。我們通過inflate方法將獲得的布局作為參數(shù)傳給ViewHolder的構(gòu)造器,將findViewById的方法全部交給ViewHolder去處理,這樣我們處理任何控件時,只需要操作holder就可以了。
我們的item布局界面(R.layout.item_rv)很簡單,我們僅僅展示一條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():這個就很簡單了,我們在這里需要處理的僅僅是每條item中的所有界面元素和數(shù)據(jù)的綁定,在demo中我們將datas中對應(yīng)的字符串交給holder中的TextView展示即可,當(dāng)然為了讓我們看到綁定的結(jié)果,我們設(shè)置,textView的點擊監(jiān)聽,彈出一條Toast。
getItemCount():也是最好理解的一個方法,通過返回值我們告訴RecyclerView需要展示多少個item。
4.大功告成?
好了,現(xiàn)在萬事俱備,我們需要做的僅僅是打開手機收獲我們的結(jié)果了:
demo展示效果如下:
很好,我們花費了很長時間,終于把效果實現(xiàn)了!撒花!
然而
原因很簡單,我們花費大量的時間成本,學(xué)習(xí)達(dá)成的效果顯然和我們以往使用的ListView效果一樣,那么我們學(xué)習(xí)它的意義何在?這顯然不符合程序員三大美德:懶惰 缺乏耐性 和傲慢 ( laziness,Impatience.and Hubris)
當(dāng)然是有意義的。不過這需要我們慢慢去了解和感受,因為簡單的需求是體現(xiàn)不出來其實用和簡單性的,當(dāng)需求隨著時間的堆積而一次次的變得復(fù)雜,終究我們會有一天發(fā)現(xiàn),RecyclerView實在太好用了!
三*.簡單好用的小控件:CardView
1.配置方式
在AndroidStudio項目app的Gradle文件中添加依賴:
//注意:將25.0.1換成你目錄下v7包一樣的版本號 compile 'com.android.support:cardview-v7:25.0.1'和RecyclerView一樣,我們需要將CardView的版本和V7包的版本一致,否則編譯會不通過。
添加完依賴并同步之后,我們就可以直接使用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>很簡單,CardView本身就是extends FrameLayout的,使用方式和FrameLayou基本沒有區(qū)別。
3.基本屬性
基本屬性如下,最常用的也就是前兩個
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
四, 練手小案例
接下來做一個好玩的小案例來鞏固RecyclerView的知識,好友印象
[好友印象]
案例效果如下:
界面效果還不錯,依靠同樣是support v7包中的CardView,顧名思義,就是類似于卡片一樣的控件,簡約而又美觀,實在是開發(fā)個人應(yīng)用時的一大神器。
而卡片的刪除效果則是RecyclerView自帶的效果,不僅僅是刪除的效果,RecyclerView還自帶很多其他的動畫效果,相比之下確實比GridView好用許多。
【好友印象】源碼在此,戳我!
總結(jié)
以上是生活随笔為你收集整理的RecyclerView使用探索1--了解及使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是 Benchmarks?
- 下一篇: SAP 创建利润中心标准层次