Recyclerview簡介
Recyclerview是v7支持庫中的組件,用來替代listview和gridview睦擂。它有以下新特性:
- 內(nèi)部封裝了
ViewHolder
類,強制性使用ViewHolder
來提升性能 - 布局方式交給
LayoutManager
來管理忽刽,可以方便的實現(xiàn)橫向,縱向跪帝,網(wǎng)格些阅,瀑布流視圖 - 內(nèi)置了
ItemDecoration
,可以實現(xiàn)自定義的分割效果 - 提供
ItemAnimator
市埋,可以自定義數(shù)據(jù)改變時的動畫效果 - 全新的Item回收復用機制
- 不再提供
Listview
的onItemClickListener
接口,將事件交給Item處理抒倚,或者使用onItemTouchListener
來處理觸摸事件
Recyclerview使用
- 布局中引入Recyclerview。Recyclerview是v7支持庫中的組件托呕,使用之前要先引入。
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_title"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
- 創(chuàng)建Item布局馅扣。 這里我們定義兩種類型,一個textView差油,一個ImageView任洞,用來顯示文字和圖片
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</TextView>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ImageView>
- 實現(xiàn)Recyclerview的adapter。
首先要實現(xiàn)Recyclerview的ViewHolder侈咕,這個Recyclerview中包含兩種類型item,所以新加了一個參數(shù)楼眷,ItemType,用來判斷ItemView的類型:
private class RecycleHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
private ImageView mImageView;
public RecycleHolder(View itemView,int viewType) {
super(itemView);
switch (viewType){
case ITEM_TYPE_TEXT:
mTextView = (TextView) itemView;
break;
case ITEM_TYPE_IMAGE:
mImageView = (ImageView) itemView;
}
}
}
然后實現(xiàn)Adapter罐柳, RecyclerView的Adapter默認只有三個方法狰住,看起來簡潔了許多
public RecycleHolder onCreateViewHolder(ViewGroup parent, int viewType)
引入Item布局,交給VIewHolder類肮蛹,創(chuàng)建holder。
public void onBindViewHolder(RecycleHolder holder, int position)
在指定的position顯示時回調(diào)伦忠,用來展示數(shù)據(jù)
public int getItemCount()
獲取item數(shù)量
除此之外稿辙,當前是有兩種類型的Item,所以還需要實現(xiàn)一個方法getItemViewType(int position)
邻储,獲取當前位置對應的type。完整的Adapter代碼如下:
private class RecycleAdapter extends RecyclerView.Adapter<RecycleHolder>
{
@Override
public RecycleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View ItemView = null;
switch (viewType){
case ITEM_TYPE_TEXT:
ItemView = LayoutInflater.from(getActivity()).inflate(R.layout.item_txt,parent,false);
break;
case ITEM_TYPE_IMAGE:
ItemView = LayoutInflater.from(getActivity()).inflate(R.layout.item_txt,parent,false);
break;
}
return new RecycleHolder(ItemView,viewType);
}
@Override
public void onBindViewHolder(RecycleHolder holder, int position) {
switch (holder.viewType){
case ITEM_TYPE_TEXT:
holder.mTextView.setText(mItems.get(position));
break;
case ITEM_TYPE_IMAGE:
holder.mImageView.setImageResource(Integer.parseInt(mItems.get(position)));
break;
}
}
@Override
public int getItemCount() {
return mItems.size();
}
@Override
public int getItemViewType(int position) {
if(position < 5)
return ITEM_TYPE_TEXT;
else return ITEM_TYPE_IMAGE;
}
}
這里先在getItemViewType(int position)
方法做了判斷脓匿,前5個位置放置TextView萌壳,其他的是ImageView日月,然后在onCreateViewHolder
里缤骨,根據(jù)ViewType來獲取對應的Holder。ViewHolder類中已經(jīng)對ViewType做了判斷绊起,可以攜帶不同的ItemView燎斩。最后在onBindViewHolder
中,對ItemView進行設(shè)置栅表。到這里Adapter的工作已經(jīng)完成了。
順便上一下數(shù)據(jù)源mItems的代碼怪瓶。作為演示,簡單的設(shè)置一下洗贰,前5項為文字,后五項是圖片:
mItems = new ArrayList<>();
for(int i = 0; i<10; i++ ){
if (i<5){
String item = "Item No." + i;
mItems.add(item);}
else mItems.add(String.valueOf(R.drawable.ic_launcher));
}
- 為Recyclerview對象設(shè)置Adapter和LayoutManager:
RecyclerView mRecyclerView = (RecyclerView) v.findViewById(R.id.list_title);
RecyclerView.LayoutManager manager=new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setAdapter(new RecycleAdapter());
這里介紹一下RecyclerView.LayoutManager
许布,系統(tǒng)已經(jīng)給我們提供了三種類型的實現(xiàn)绎晃,LinearLayoutManager
,GridLayoutManager
庶艾,StaggeredGridLayoutManager
,分別對應線性落竹,網(wǎng)格,瀑布流布局述召。關(guān)于布局的設(shè)置都交給它來管理,比如改為橫向展示藤为,只要設(shè)置LinearLayoutManager.sertOrientation(LinearLayoutManager.HORIZONTAL)
就可以了
另外,對于Recyclerview的Measure方式缅疟,在LayoutManager中提供了一個方法setAutoMeasureEnabled
,設(shè)置為true表示Recyclerview將自動完成布局存淫,設(shè)置為wrap_content方式,如果設(shè)置為false桅咆,表示Measure工作交給LayoutManager,通過覆寫LayoutManager的onMeasure方法來實現(xiàn)自定義布局岩饼。