介紹
RecyclerView與ListView原理是類似的:都是僅僅維護少量的View並且可以展示大量的數據集。RecyclerView用以下兩種方式簡化了數據的展示和處理:
- 使用LayoutManager來確定每一個item的排列方式。 爲增加和刪除項目提供默認的動畫效果。
- 你也可以定義你自己的LayoutManager和添加刪除動畫。
Adapter:使用RecyclerView之前,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數據與每一個item的界面進行綁定。 - LayoutManager:用來確定每一個item如何進行排列擺放,何時展示和隱藏。回收或重用一個View的時候,LayoutManager會向適配器請求新的數據來替換舊的數據,這種機制避免了創建過多的View和頻繁的調用findViewById方法(與ListView原理類似)。
目前SDK中提供了三種自帶的
- LayoutManager:
- LinearLayoutManager
GridLayoutManager
第一節、簡單的RecyclerView使用方法
1、xml佈局(原生的v7包下的)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycleView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
2、Activity中獲取這個RecyclerView,並聲明LayoutManager與Adapter,代碼如下:
LinearLayoutManager layoutManager = new GridLayoutManager(this, 4);
//設置佈局管理器
myRecycleView.setLayoutManager(layoutManager);
//設置水平或者垂直佈局
layoutManager.setOrientation(OrientationHelper.VERTICAL);
//設置適配器
MyAdapter myAdapter = new MyAdapter(this, mDatas);
myRecycleView.setAdapter(myAdapter);
//設置條目動畫
myRecycleView.setItemAnimator(new DefaultItemAnimator());
//如果可以確定每個item的高度是固定的,設置這個選項可以提高性能
mRecyclerView.setHasFixedSize(true);
3、接下來的問題就是Adapter的創建:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private List<String> mDatas;
public MyAdapter(Context context, List<String> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
//創建新View,被LayoutManager所調用
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_num, parent,false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.content.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView content;
public MyViewHolder(View itemView) {
super(itemView);
content = (TextView) itemView.findViewById(R.id.tv_cs);
}
}
}
橫向佈局
如果想要一個橫向的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即可:
recyclerView.setLayoutManager(newStaggeredGridLayoutManager(columNum, StaggeredGridLayoutManager.VERTICAL));