RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK识樱,它的靈活性與可替代性比listview更好。接下來學習如何使用RecyclerView,徹底拋棄ListView.
** 介紹 **
RecyclerView與ListView原理是類似的:都是僅僅維護少量的View并且可以展示大量的數據集愉择。RecyclerView用以下兩種方式簡化了數據的展示和處理:
- 使用LayoutManager來確定每一個item的排列方式簸州。
- 為增加和刪除項目提供默認的動畫效果枯夜。
- Adapter:使用RecyclerView之前价捧,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數據與每一個item的界面進行綁定。
- LayoutManager:用來確定每一個item如何進行排列擺放遗增,何時展示和隱藏】钋啵回收或重用一個View的時候做修,* * * LayoutManager會向適配器請求新的數據來替換舊的數據,這種機制避免了創(chuàng)建過多的View和頻繁的調用*findViewById方法(與ListView原理類似)抡草。
目前SDK中提供了三種自帶的LayoutManager:
- LinearLayoutManager
- GridLayoutManager
- StaggeredGridLayoutManager
** RecyclerView簡單使用方法 **
** 1.添加依賴 **
在AS的build.gradle中添加依賴饰及,然后同步一下就可以引入依賴包:
dependencies {
...
compile 'com.android.support:recyclerview-v7:21.0.+'
}
** 2、編寫代碼 **
添加完依賴之后康震,就開始寫代碼了燎含,與ListView用法類似,也是先在xml布局文件中創(chuàng)建一個RecyclerView的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android(http://schemas.android.com/apk/res/android)"
xmlns:tools="[http://schemas.android.com/tools](http://schemas.android.com/tools)"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</RelativeLayout>
- 創(chuàng)建完布局之后在MainActivity中獲取這個RecyclerView腿短,并聲明LayoutManager與Adapter
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
//創(chuàng)建默認的線性LayoutManager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以確定每個item的高度是固定的屏箍,設置這個選項可以提高性能
mRecyclerView.setHasFixedSize(true);
//創(chuàng)建并設置Adapter
mAdapter = newMyAdapter(getDummyDatas());
mRecyclerView.setAdapter(mAdapter);
- 接下來的問題就是Adapter的創(chuàng)建:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public String[] datas = null;
public MyAdapter(String[] datas) {
this.datas = datas;
}
//創(chuàng)建新View,被LayoutManager所調用
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
ViewHolder vh = new ViewHolder(view);
return vh;
}
//將數據與界面進行綁定的操作
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.mTextView.setText(datas[position]);
}
//獲取數據的數量
@Override
public int getItemCount() {
return datas.length;
}
//自定義的ViewHolder橘忱,持有每個Item的的所有界面元素
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View view){
super(view);
mTextView = (TextView) view.findViewById(R.id.text);
}
}
}
** 3赴魁、運行 **
寫完這些代碼這個例子既可以跑起來了。從例子也可以看出來钝诚,RecyclerView的用法并不比ListView復雜尚粘,反而更靈活好用,它將數據敲长、排列方式郎嫁、數據的展示方式都分割開來秉继,因此可定制型,自定義的形式也非常多泽铛,非常靈活尚辑。
** 橫向布局 **
如果想要一個橫向的List只要設置LinearLayoutManager如下就行,注意要聲明mLayoutManager的類型是LinearLayoutManager而不是父類LayoutManager:
mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
** Grid布局 **
如果想要一個Grid布局的列表盔腔,只要聲明LayoutManager為GridLayoutManager即可:
mLayoutManager = new GridLayoutManager(context,columNum);
mRecyclerView.setLayoutManager(mLayoutManager);
注意杠茬,在Grid布局中也可以設置列表的Orientation屬性,來實現橫向和縱向的Grid布局弛随。
** 瀑布流布局 **
瀑布流就使用StaggeredGridLayoutManager吧瓢喉,具體方法與上面類似,就不做介紹啦舀透。