在前面的學習中,咱們已經對Adapter
有了大概的瞭解,在整個RecyclerView
的體系當中,Adapter
負責提供View
,而LayoutManager
負責決定它們在RecyclerView
中擺放的位置以及在窗口中不可見以後的回收策略。今天,咱們來一塊兒看一下LayoutManager
的相關知識。bash
LayoutManager
的使用經過重寫LayoutManager
,咱們能夠獲得各式各樣的佈局。官方提供瞭如下三種LayoutManager
:ide
LinearLayoutManager
GirdLayoutManager
StaggeredGridLayoutManager
下面,咱們就來一塊兒學習它們的使用方式。佈局
LinearLayoutManager
使用這個LinearLayoutManager
時,全部的Item
都是線性排列的,咱們能夠指定如下兩點。學習
LinearLayoutManager.OrientationHelper.VERTICAL
:
LinearLayoutManager.OrientationHelper.HORIZONTAL
:
Item
排列的順序和滑動方向經過reverse
指定Items
排列的順序:ui
true
:從右向左或從下到上排列,也就是position=0
的Item
位於最右邊或最下面,往左或者往上滑動獲得下一個Item
。
false
:和上面相反,也就是咱們常見的模式。GirdLayoutManager
經過spanCount
參數指定,至關於把RecyclerView
的每行或者每列均分爲spanCount
個格子,每一個Item
能夠佔據一個或者多個格子,默認狀況下每一個Item
佔據一個格子,也就是均分。this
reverse
參數指定了Items
排列的順序:spa
reverse=true
:逆序排列全部的Item
,和2.1.2
的排列方式有關,若是是縱向排列,那麼position=0
的Item
位於左下角,若是是橫向排列,那麼位於右上角。reverse=false
:position=0
的Item
位於左上角。上面咱們說過,spanCount
指定的是分配的格子數,默認狀況下每一個Item
會佔據一個格子,若是想要改變每一行或者每一列Item
分配的比例,那麼能夠指定它們佔據的格子數,若是該行或者該列剩餘的格子不夠分配了,那麼就換行,可是必定不可以大於spanCount
的值:3d
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
複製代碼
下面是一個使用的例子:code
private void init() {
mTitles = new ArrayList<>();
for (int i = 0; i < 40; i++) {
mTitles.add(String.valueOf(i));
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_content);
GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position % 3 == 0 ? 1 : 2;
}
});
recyclerView.setLayoutManager(layoutManager);
LayoutManagerAdapter adapter = new LayoutManagerAdapter(mTitles);
recyclerView.setAdapter(adapter);
}
複製代碼
最終獲得效果爲: ip
StaggeredGridLayoutManager
spanCount
和宮格佈局相似,能夠指定每行或者每列劃分的格子數,可是它不支持讓某個Item
佔據多個格子。
這個和上面兩個LayoutManager
的原理相似,就不解釋了。
默認狀況下,若是咱們只生成一個StaggeredGridLayoutManager
,那麼效果會是下面這樣:
onBindViewHolder
中動態地改變每一個
itemView
的高度,這樣才能夠達到瀑布流的效果:
@Override
public void onBindViewHolder(LayoutManagerViewHolder holder, int position) {
holder.setTitle(mTitles.get(position));
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
layoutParams.height = 200 + (position % 4) * 200;
holder.itemView.setBackgroundColor(holder.itemView.getResources().getColor(COLOR[position % 5]));
holder.itemView.setLayoutParams(layoutParams);
}
複製代碼
以後,咱們會獲得下面的效果:
平時的開發當中,這幾個佈局已經基本可以知足咱們的需求,若是須要了解自定義LayoutManager
,那麼須要對RecyclerView
的整個機制就很好的瞭解,在分析完原理以後,咱們在詳細講解自定義LayoutManager
的方法。