前言


在前面的文章中。每一个演示样例,都使用了LayoutManager,毕竟它是RecyclerView必不可少的一部分。

LayoutManager,顾名思义,就是『布局管理器』。

使用例如以下代码,设置RecyclerView的LayoutManager:

mRecyclerView.setLayoutManager(layoutManager);

已提供的LayoutManager

android.support.v7.widget.LinearLayoutManager

android.support.v7.widget.GridLayoutManager

android.support.v7.widget.StaggeredGridLayoutManager


LinearLayoutManager

线性 水平或垂直 布局

构造函数例如以下:

public LinearLayoutManager(Context context) {
this(context, VERTICAL, false);
} public LinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
setOrientation(orientation);
setReverseLayout(reverseLayout);
setAutoMeasureEnabled(true);
} public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
...
}

第1个中,内部使用了第2个。第3个是xml中配置时使用的。实现跟第2个的实现相似。这里就解释下第2个构造方法中的參数意义:

orientation —— 取值 LinearLayoutManager.HORIZONTAL。表示水平方向。取值 LinearLayoutManager.VERTICAL,表示垂直方向

reverseLayout —— 是否须要布局反转。

true。表示须要:若是方向为HORIZONTAL,则内容会从右到左显示,滚动方向也是;相同。方向为VERTICAL时,则内容会从下向上显示,滚动方向也是

GridLayoutManager

网格布局。

构造函数例如以下:

public GridLayoutManager(Context context, int spanCount) {
super(context);
setSpanCount(spanCount);
} public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
setSpanCount(spanCount);
} public GridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {…} //xml

因为GridLayoutManager 继承了 LinearLayoutManager,所以构建函数中的參数意思几乎相同。

主要说下參数 spanCount 意义:在方向为HORIZONTAL时,spanCount就表示有几行;在方向为VERTICAL时,spanCount就表示有几列

StaggeredGridLayoutManager

交错的网格布局。

构造函数例如以下:

public StaggeredGridLayoutManager(int spanCount, int orientation){
mOrientation = orientation;
setSpanCount(spanCount);
setAutoMeasureEnabled(mGapStrategy != GAP_HANDLING_NONE);
mLayoutState = new LayoutState();
createOrientationHelpers();
}
public StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {…} //xml

StaggeredGridLayoutManager 继承了 GridLayoutManager。參数意义与GridLayoutManager相似。

要实现交错式,除了设定RV的layoutManger为StaggeredGridLayoutManager外。还要设置item的宽或高的尺寸。

当方向为HORIZONTAL时,spanCount表示总的行数,这时为item设置不一样的宽度,即有横向交错的感觉。

当方向为HORIZONTAL时,spanCount表示总的列数,这时为item设置不一样的高度。即有纵向交错的感觉。

假设仅仅是对item设置LayoutParams,那么还须要对应的设置item的内容view的LayoutParams。所以假设能够,直接改变item内容view的LayoutParams就可以

关于改变宽或高的演示样例代码:

@Override
public void bindCustomViewHolder(BaseHolder holder, int position) {
holder.itemView.setFocusable(true);//加了这句,电视上就能滚动了 TextView tvTitle = holder.getView(R.id.tv_title);
tvTitle.setText(getItem(position)); View vImg = holder.getView(R.id.v_img);
vImg.setBackgroundColor(getColor()); if (mIsStaggered) {
float size = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());//100dip转px
int w = mOrientation == LinearLayoutManager.HORIZONTAL ? (int)size : -1;
int h = mOrientation == LinearLayoutManager.HORIZONTAL ? -1 : (int)size;
if (mOrientation == LinearLayoutManager.HORIZONTAL) {
w = (int) (size + Math.random() * size);
} else {
h = (int) (size + Math.random() * size);
}
// holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(w, h));
vImg.setLayoutParams(new RelativeLayout.LayoutParams(w, h));
}
}

注:因为这里设置成宽高随机值,所以每次又一次滑动到開始位置时。都会又一次布局。假设给一个定长就不会了:

w = (int)size;

if (position % 2 == 1) {

w = w / 2;

}

演示样例详情:https://github.com/aa86799/RecyclerView/tree/recycler-restart/

从头開始学 RecyclerView(六) LayoutManager的更多相关文章

  1. 从头開始学 RecyclerView(三) 封装简化

    前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...

  2. 送给刚刚開始学cocos2d-x引擎 移植Android的同学

    刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.cs ...

  3. 从零開始学Swift之Hello World进化版

    上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...

  4. [php learn] php 从头開始学习1

    前言:大概在2006年的时候,学习过一段时间的php.而且当时做了一个下载的站点,后来因为读研究生阶段用的是java.j2ee相关,所以php就搁浅掉了,php这些年也发生了非常大的变化,最大一个变化 ...

  5. 关东升的《从零開始学Swift》即将出版

    大家好: 苹果2015WWDC大会公布了Swift2.0,它较之前的版本号Swift1.x有非常大的变化.所以我即将出版<从零開始学Swift><从零開始学Swift>将在&l ...

  6. 《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

    <PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版 ...

  7. 从零開始学android&lt;数据存储(1)SharedPreferences属性文件.三十五.&gt;

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

  8. 【高德地图API】从零開始学高德JS API(五)路线规划——驾车|公交|步行

    先来看两个问题:路线规划与导航有什么差别?步行导航与驾车导航有什么差别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自己定义路线规划功能,这是别家没有 ...

  9. 第13章、布局Layouts之RelativeLayout相对布局(从零開始学Android)

    RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是依照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布 ...

随机推荐

  1. OOD沉思录 --- 面向动作与面向对象 --- 避免全能类

    面向过程的软件开发通过非常集中化的控制机制来分解功能,在程序设计中表现就是大量的条件判断,深层次的循环嵌套等. 这种模式下,我们可以通过分析方法的参数,局部变量及其访问的全局变量来得到方法对数据的依赖 ...

  2. ARM开发板搭建NFS网络文件共享方法

    前边 已经提到过吧vmare的IP改成了静态IP,对于上网来说,这个是个麻烦的事.现在重新配置Vmware的IP VMware-Edit-Virtual network editor 选择PC机的无线 ...

  3. Highcharts实现走势图

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  4. python 三级菜单 的另1种实现方法

    menu = { "华南":{ "广东":["广州市","佛山市","深圳市","东莞市& ...

  5. Python协程(中)

    协程嵌套 使用async可以定义协程,协程用于耗时的io操作,我们也可以封装更多的io操作过程,这样就实现了嵌套的协程,即一个协程中await了另外一个协程,如此连接起来. import asynci ...

  6. C和指针之学习笔记(1)

    第1章 1.输入字符串 while((ch=getchar())!=EOF  &&  ch!=’\n’) ; ch=getchar() while(ch!=EOF  && ...

  7. luogu P4115 Qtree4

    题目链接 luogu P4115 Qtree4 题解 动态点分治,和上一题一样.同样三个堆.就是带权,用边权替换深度就好 为什么要单独写这个题解呢,因为我卡常卡了一天....据说树剖比rmq快? 在第 ...

  8. MySql - GROUP BY 和 HAVING关键字

    本文主要针对GROUP BY 和 HAVING两个关键字进行分析 使用测试表如下: 测试前,只知道GROUP BY 这个关键字的作用是根据一个字段进行分组,去重.HAVING对分组设置条件. 具体分组 ...

  9. bzoj 2286

    第一道"虚树"题目(好吧,我也不知道这是不是虚树,但和虚树的思想肯定是一样的,都是简化树结构) 这一类算法核心思想都是简化树结构,只取我们必须的节点和一些信息,然后在简化后的树结构 ...

  10. 第一章 -- Java性能调优概述

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 1.概述 2 ...