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 知识梳理系列:

相关文章
相关标签/搜索