RecycleView
1.RecyclerView是什麼?
RecylerView:是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁
有 item回收複用的功能,這一點從它的名字recylerview即回收view也可以看出。
2.RecyclerView的優點是什麼?
根據官方的介紹RecylerView是ListView的升級版,既然如此那RecylerView必然有它的優點,現就
RecylerView相對於ListView的優點羅列如下:
①RecylerView封裝了viewholder的回收複用,也就是說RecylerView標準化了ViewHolder,編寫
Adapter 面向的是ViewHolder而不再是View了,複用的 邏輯被封裝了,寫起來更加簡單。
②提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecylerView專門抽取出
以通過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑
布流對應的還有StaggeredGridLayoutManager等),也就是說RecylerView不再拘泥於ListView的線
RecylerView的ItemDecoration這個類,然後針對自己的業務需求去抒寫代碼。
③可以控制Item增刪的動畫,可以通過ItemAnimator這個類進行控制,當然針對增刪的動畫,
RecylerView有其自己默認的實現。
3.使用步驟:
3.1導入recyclerView-v7包
3.2在佈局文件中添加一個RecycleView
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
3.3創建一個佈局文件用來給每一個Item佈局
3.4聲明數據並與佈局文件中的控件進行綁定
聲明RecycleView對象
private RecyclerView recyclerView;
聲明數據集合
private List<Map<String, Object>> mList;
3.5設置佈局管理器格式
線性佈局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(this));
3.6 創建適配器
同ListView一樣,RecyclerView只負責顯示,而組建數據的任務,我們也需要一個Adapter來完成。
MyAdapter adapter = new MyAdapter();
適配器與RecycleView進行綁定
recyclerView.setAdapter(adapter);
創建適配器 :**Adapter需要繼承自RecyclerView.Adapter**
在這裏我們可以給Adapter一個泛型,這個泛型指定了該Adapter
所使用的ViewHolder,如果不指定泛型,則默認是RecyclerView.ViewHolder,
即自定義ViewHolder的父類
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHoler> {
重寫3個方法
當需要拿到ViewHolder 的時候就會調用,返回值與之前的泛型相同,在加載不同類型的佈局的時
候,可以根據ViewType來創建不同的ViewHolder
viewType是Item的數據類型
public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {
根據拿到的佈局文件創建一個ViewHolder
View view =
LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, null);
MyViewHoler viewHoler = new MyViewHoler(view);
return viewHoler;
}
當內容和佈局進行綁定的時候回調這個方法,每當有新數據進入屏幕的時候,也會回調這個方法
參數holder和ViewHolder類型與泛型所規定的類型相同,
參數position代表的是該item的位置可以通過position來獲取相應的數據
public void onBindViewHolder(MyViewHoler holder, int position) {
從數據列表中獲取數據
String text = mList.get(position).get("text").toString();
int image = (Integer) mList.get(position).get("image");
將數據設置到界面上
holder.textView.setText(text);
holder.imageView.setImageResource(image);
}
返回數據的個數
public int getItemCount() {
return mList.size();
}
3.7創建ViewHolder
與ListView的ViewHolder不同,RecyclerView的ViewHolder需要
繼承自**RecyclerView.ViewHolder**
class MyViewHoler extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView;
public MyViewHoler(View itemView) {
super(itemView);
進行控件關聯
textView = (TextView) itemView.findViewById(R.id.textView);
imageView = (ImageView) itemView.findViewById(R.id.imageView);
}
}
**表格(GridLayoutManager)**
將線性佈局管理器替換爲表格佈局管理器,就可以使用表格佈局
recyclerView.setLayoutManager(new GridLayoutManager(this,3));
第一個參數:上下文
第二個參數:列數
GridLayoutManager(Context context, int spanCount, int orientation,
boolean reverseLayout)
第二個參數spanCount表示表格的行數或者列數;第三個參數表示是水平滑動或者是豎直方向滑動;
最後一 個參數表示是否從數據的尾部開始顯示。
**瀑布流 (StaggeredGridLayoutManager)**
將線性佈局管理器替換爲瀑布流佈局管理器,就可以使用瀑布流佈局
recyclerView.setLayoutManager(new
StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
第一個參數是行(或列的數目)
第二個參數是滾動方向,如果爲橫向滾動,則每一個item的行高固定
如果爲縱向滾動,則每一個item的列寬固定