RecyclerView 知識梳理(3) LayoutManager

1、概述

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

2、LayoutManager的使用

經過重寫LayoutManager,咱們能夠獲得各式各樣的佈局。官方提供瞭如下三種LayoutManageride

  • LinearLayoutManager
  • GirdLayoutManager
  • StaggeredGridLayoutManager

下面,咱們就來一塊兒學習它們的使用方式。佈局

2.1 線性佈局:LinearLayoutManager

使用這個LinearLayoutManager時,全部的Item都是線性排列的,咱們能夠指定如下兩點。學習

2.1.1 縱向/橫向排列

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

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

經過reverse指定Items排列的順序:ui

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

2.2 宮格佈局:GirdLayoutManager

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

經過spanCount參數指定,至關於把RecyclerView的每行或者每列均分爲spanCount個格子,每一個Item能夠佔據一個或者多個格子,默認狀況下每一個Item佔據一個格子,也就是均分。this

2.2.2 縱向/橫向排列

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

2.2.3 reverse參數

指定了Items排列的順序:spa

  • reverse=true:逆序排列全部的Item,和2.1.2的排列方式有關,若是是縱向排列,那麼position=0Item位於左下角,若是是橫向排列,那麼位於右上角。
  • reverse=falseposition=0Item位於左上角。

2.2.4 指定分配的比例

上面咱們說過,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

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);
    }
複製代碼

以後,咱們會獲得下面的效果:

3、小結

平時的開發當中,這幾個佈局已經基本可以知足咱們的需求,若是須要了解自定義LayoutManager,那麼須要對RecyclerView的整個機制就很好的瞭解,在分析完原理以後,咱們在詳細講解自定義LayoutManager的方法。


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

相關文章
相關標籤/搜索