RecyclerView 知識梳理(3) - LayoutManager

一、概述

在前面的學習中,我們已經對Adapter有了大概的了解,在整個RecyclerView的體系當中,Adapter負責提供View,而LayoutManager負責決定它們在RecyclerView中擺放的位置以及在窗口中不可見之后的回收策略。今天,我們來一起看一下LayoutManager的相關知識。

二、LayoutManager的使用

通過重寫LayoutManager,我們可以得到各式各樣的布局。官方提供了以下三種LayoutManager

  • LinearLayoutManager
  • GirdLayoutManager
  • StaggeredGridLayoutManager

下面,我們就來一起學習它們的使用方式。

2.1 線性布局:LinearLayoutManager

使用這個LinearLayoutManager時,所有的Item都是線性排列的,我們可以指定以下兩點。

2.1.1 縱向/橫向排列

  • 縱向排列:LinearLayoutManager.OrientationHelper.VERTICAL
  • 橫向排列:LinearLayoutManager.OrientationHelper.HORIZONTAL

2.1.2 Item排列的順序和滑動方向

通過reverse指定Items排列的順序:

  • true:從右向左或從下到上排列,也就是position=0Item位于最右邊或最下面,往左或者往上滑動得到下一個Item
  • false:和上面相反,也就是我們常見的模式。

2.2 宮格布局:GirdLayoutManager

2.2.1 指定某行或某一列的個數

通過spanCount參數指定,相當于把RecyclerView的每行或者每列均分為spanCount個格子,每個Item可以占據一個或者多個格子,默認情況下每個Item占據一個格子,也就是均分。

2.2.2 縱向/橫向排列

  • 縱向排列:先填滿一行,再從下一行開始填充。
  • 橫向排列:先填滿一列,在從下一列開始填充。

2.2.3 reverse參數

指定了Items排列的順序:

  • reverse=true:逆序排列所有的Item,和2.1.2的排列方式有關,如果是縱向排列,那么position=0Item位于左下角,如果是橫向排列,那么位于右上角。
  • reverse=falseposition=0Item位于左上角。

2.2.4 指定分配的比例

上面我們說過,spanCount指定的是分配的格子數,默認情況下每個Item會占據一個格子,如果想要改變每一行或者每一列Item分配的比例,那么可以指定它們占據的格子數,如果該行或者該列剩余的格子不夠分配了,那么就換行,但是一定不能夠大于spanCount的值:

public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
    mSpanSizeLookup = spanSizeLookup;
}

下面是一個使用的例子:

   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);
    }

最終得到效果為:


2.3 瀑布流:StaggeredGridLayoutManager

2.3.1 指定spanCount

和宮格布局類似,可以指定每行或者每列劃分的格子數,但是它不支持讓某個Item占據多個格子。

2.3.2 橫向或者縱向排列

這個和上面兩個LayoutManager的原理類似,就不解釋了。

2.3.3 實戰

默認情況下,如果我們只生成一個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的方法。


更多文章,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,544評論 25 708
  • 一.常用控件的使用方法 1.TextView match_parent 由父布局來決定當前控件的大小。wrap_c...
    努力生活的西魚閱讀 1,248評論 5 0
  • 這篇文章分三個部分,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,426評論 0 27
  • 昨晚又夢見奶奶了。 奶奶去世十多年了,一直想為奶奶寫點什么,又怕我拙劣的筆觸破壞了奶奶的形象。 在我的記憶里,媽媽...
    秋日陽光閱讀 551評論 11 6
  • 我不知道別的年輕人是怎么樣的 但是我身邊的人 當然也包括我 都或多或少的有早戀的經歷 也許有的確實現在相處的很好 ...
    凡天星宇閱讀 253評論 2 0