Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> RecyclerView詳解之基礎使用

RecyclerView詳解之基礎使用

編輯:關於Android編程

android.support.v7.widget.RecyclerView
android.support.v7.widget.LinearLayoutManager
android.support.v7.widget.GridLayoutManager
android.support.v7.widget.StaggeeredGridLayoutManager
android.support.v7.widget.RecyclerView.Adapter
android.support.v7.widget.RecyclerView.ViewHolder
android.support.v7.widget.RecyclerView.LayoutManager
android.support.v7.widget.RecyclerView.ItemDecoration
android.support.v7.widget.RecyclerView.ItemAnimator

RecyclerView和以前的ListView、GridView相比起來,性能上更好,耦合性更低,然而使用起來相對來說復雜度有所增加,在開發中能夠使用這個控件的地方盡量使用。

基本介紹

下面介紹和RecyclerView緊密相關的幾個類型:

1、LayoutManager,這是控制RecyclerView布局方式的管理類,這是一個抽象類,默認提供的實現有LinearLayoutManager和GridLayoutManager和StaggeeredGridLayoutManager,主要對應於
線性布局和網格布局方式。效果圖如:
GridLayoutManager:

這裡寫圖片描述

LinearLayoutManager:

這裡寫圖片描述

2、ItemDecoration,主要用於RecyclerView的分割線,如果需要在RecyclerView中使用分割線就需要繼承這個類去自定義。RecyclerView沒有提供默認的分割線。 3、ItemAnimator,主要用於Item的添加、刪除時的動畫,需要使用的時候需要繼承自這個類去自定義。 4、Adapter,這是RecyclerView的一個內部類,作用和平時我們使用的Adapter一樣,主要用於RecyclerView的Adapter設置,在往RecyclerView中添加數據時需要繼承這個Adapter去實現自己的內容。 5、ViewHolder,類似於平時我們使用的Adapter中定義的ViewHolder,在使用RecyclerView的Adapter的時候必須使用該類。

基本用法

1、布局屬性

1、mst:reverseLayout,取值為true和false。表示布局後Item是否是逆向布局,正常情況下是從上到下,從左到右,設置這個屬性後會逆向布局,也就是從下到上,從右到左。 2、mst:spanCount,取值為整數。網格布局時網格的列數,該屬性只在GridLayoutManager和StaggeeredGridLayoutManager中使用到。 3、android:orientation,取值為horizontal或者vertical。表示RecyclerView的布局是橫向還是縱向排列,如果是在網格布局中將該屬性設置為那麼spanCount就表示網格行數。 4、mst:layoutManager,通過LayoutManage的完整類名給RecyclerView設置LayoutManager,這樣就不用在代碼裡面設置了。

2、使用方式之初始化

1、布局:
2、Adapter,自己的Adapter必須繼承自RecyclerView.Adapter,這是一個泛型類,具體類型必須是RecyclerView.ViewHolder或者子類。
Adapter的定義:
class MyAdapter extends RecyclerView.Adapter { private ArrayList mData = new ArrayList(); @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ MyViewHolder holder = new MyViewHolder(LayoutInflater.from( mContext).inflate(R.layout.recyclerview_item, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position){ holder.bindData(mData,position); } @Override public int getItemCount() { return mDatas.size(); } @Override public int getItemViewType(int position){ return super.getItemViewType(position); } static class MyViewHolder extends ViewHolder { TextView text; public MyViewHolder(View view) { super(view); text = (TextView) view.findViewById(android.R.id.text1); } public void bindData(ArrayList datas,int position){ text.setText(datas.get(position)); } } }

RecyclerView的初始化:

RecyclerView mList = (RecyclerView)mContentView.findViewById(R.id.recycler_view); mList.setLayoutManager(new LinearLayoutManager(mContext,LinearLayoutManager.VERTICAL,false)); mList.setAdapter(new MyAdapter());

3、使用方法之Adapter

Adapter常用方法,RecyclerView的Adapter和以前我們常用的Adapter區別還是挺大的,下面介紹一些常用方法

給Item創建一個ViewHolder,其中第一個參數parent是當前RecyclerView,第二個參數是Item的View的類型,可以重寫public int getItemViewType(int position)方法,
然後在onCreateViewHolder中通過返回值去讓不同的Item加載不同的View。
public ViewHolder onCreateViewHolder(ViewGroup parent, int itemViewType)
在這裡綁定Item和數據,其中第一個參數是在onCreateViewHolder返回的ViewHolder,第二個參數是當前Item的position。
public void onBindViewHolder(ViewHolder holder, int position)
通過對不同的position返回不同的類型,然後在onCreateViewHolder中通過這裡的返回值去加載不同的View
public int getItemViewType(int position)
和以前我們用的的notifyDataSetChanged()差不多。調用這個方法會更新所有可見的Item
public final void notifyDataSetChanged()
更新指定位置的Item,這樣只會更新對應的Item,不會更新所有的Item,避免資源浪費。
public final void notifyItemChanged(int position)
更新指定返回內的Item,第一個參數是更新的Item的起始位置,第二個參數是更新的Item的條數,例如,如果需要
更新從第2條開始的5條Item,可以這樣調用這個方法notifyItemRangeChanged(2,5);
public final void notifyItemRangeChanged(int positionStart, int itemCount)
當新增一個Item的時候調用這個方法去更新新增的Item,不用全部更新。
public final void notifyItemInserted(int position)
調用這個方法去更新從指定起始位置開始的多條Item,用在同時新增多條數據,不需要逐條更新的情況下。
public final void notifyItemRangeInserted(int positionStart, int itemCount)
當刪除一條數據的時候調用這個方法去更新刪除的Item
public final void notifyItemRemoved(int position)
當刪除多條數據,不需要逐條更新的時候調用這個方法去更新刪除掉的多個Item,從起始位置開始的多條。
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

4、使用方法之ViewHolder

在使用RecyclerView時需要對Item設置ViewHolder,然後在ViewHolder中進行數據綁定和Item的初始化,這樣將數據處理和Adapter進行

static class MyViewHolder extends ViewHolder { TextView text; public MyViewHolder(View view) { super(view); text = (TextView) view.findViewById(android.R.id.text1); } public void bindData(ArrayList datas,int position){ text.setText(datas.get(position)); } }

ViewHolder常用方法:

構造函數,構造函數的參數就是Item的View,一般在這裡初始化Item中的View。
public ViewHolder(View itemView)
在Recyclerview 進行添加、移除item等操作時,position位置可能會變化,而所有的adapter的刷新並不總是及時的,只有這個方法返回的才是當前
item經過一些變換後所處的真正位置。
public final int getLayoutPosition()
獲得當前Item在Adapter中的位置
public final int getAdapterPosition()
獲得當前Item的ViewType
public final int getItemViewType()
設置當前Item是否可以被回收
public final void setIsRecyclable(boolean recyclable)
查看當前Item是否可以被回收
public final boolean isRecyclable()

4、使用方法之LayoutManager

LayoutManager主要控制RecyclerView中Item的布局方式,默認提供了如下幾個LayoutManager

LinearLayoutManager

LinearLayoutManager使得RecyclerView的布局是線性的,要麼垂直布局,要麼水平布局。
LinearLayoutManager的常用屬性:

LinearLayoutManager.HORIZONTAL
如果設置LinearLayoutManager的布局方向為水平的話,RecyclerView的布局就是線性的水平方向上的布局 LinearLayoutManager.VERTICAL
如果設置LinearLayoutManager的布局方向為垂直的話,RecyclerView的布局就是線性的垂直方向上的布局

構造函數:

默認是垂直布局
public LinearLayoutManager(Context context)
第二個參數代碼布局方向,第三個參數代表是否逆向布局
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout)
這個構造函數只在RecyclerView布局的時候指定mst:layoutManager時會被調用。
public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

常用方法:

當LayoutManager不起作用時是否會回收Item
public boolean getRecycleChildrenOnDetach()
設置當LayoutManager和RecyclerView脫離關系的時候是否會回收Item
public void setRecycleChildrenOnDetach(boolean recycleChildrenOnDetach)
設置/獲取布局方向
public void setOrientation(int orientation) ; public int getOrientation();
設置/獲取是否逆向布局
public void setReverseLayout(boolean reverseLayout) ; public boolean getReverseLayout()

常用方法先介紹這些,其他方法請參考Android官方文檔https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

GridLayoutManager

GridLayoutManager是網格布局。
構造函數:

第一個構造函數中第二個參數是網格列數
public GridLayoutManager(Context context, int spanCount);
第二個構造函數參數相對較多,第二個參數是列數,第三個數布局方向,如果orientation為horizontal的話,spanCount表示行數,最後一個參數表示是否逆向布局
public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout)
第三個構造函數主要用於從RecyclerView的布局中指定LayoutManager時使用
public GridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

常用方法:

設置每一個Item的跨度,通過這個方法可以設置Item的跨度,默認Item跨度為1,數值越大,跨度越大,例如

默認情況:這種情況下spanCount為2,跨度為1

這裡寫圖片描述

設置了自定義SpanSizeLookup:spanCount同樣為2,但是圖中的SpanSizeLookup是3, 2, 1, 3, 2, 1,3,2,1….這樣排列的,可以看到顯示效果的不同。

這裡寫圖片描述

 

public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup)

其中第一個參數SpanSizeLookup是GridLayoutManager的一個內部抽象類,如果要使用的話需要去繼承這個類,並
實現public int getSpanSize(int position),在這裡返回SpanSizeLookup的數值。例如:

public static final class MySpanSizeLookup extends SpanSizeLookup { @Override public int getSpanSize(int position) { return 2; } }
設置/獲取列數
public void setSpanCount(int spanCount) ; public int getSpanCount();
最後是GridLayoutManager是繼承自LinearLayoutManager的,部分方法和LinearLayoutManager的一樣。
StaggeredGridLayoutManager

StaggeredGridLayoutManager可以實現瀑布流形式的布局,如下圖是一個列數為2的垂直方向上的瀑布流:

這裡寫圖片描述
構造函數:

第一個構造函數,第一個參數是列數,第二個參數是布局方向,取值為StaggeredGridLayoutManager.VERTICAL和StaggeredGridLayoutManager.HORIZONTAL
public StaggeredGridLayoutManager(int spanCount, int orientation);
第二個構造函數,在從RecyclerView的布局中指定時使用。
public StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

常用方法:

設置列數
public void setSpanCount(int spanCount)
設置布局方向,取值為StaggeredGridLayoutManager.VERTICAL和StaggeredGridLayoutManager.HORIZONTAL
public void setOrientation(int orientation)
設置逆向布局
public void setReverseLayout(boolean reverseLayout)
瀑布邊緣控制策略,在StaggeredGridLayoutManager的使用中,每一個布局的都會有一個布局邊緣,當滑動狀態變為SCROLL_STATE_IDLE的時候,StaggeredGridLayoutManager會
檢查Item的布局邊緣從而更新視圖,這樣會導致Item位置發生變化,為了解決這個問題,可以使用邊緣策略方法
public void setGapStrategy(int gapStrategy);

取值為:StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
和StaggeredGridLayoutManager.GAP_HANDLING_NONE

獲得Adapter中最先可見的Item的position,這個位置不受布局方向或者是否逆向布局的影響,返回的是Item在Adapter中的位置
public int[] findFirstVisibleItemPositions(int[] into)

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved