文章目录

  • 一、RecyclerView.ItemDecoration 方法说明
  • 三、getItemOffsets 设置要点
  • 四、完整代码示例
  • 五、RecyclerView 相关资料

一、RecyclerView.ItemDecoration 方法说明


RecyclerView.ItemDecoration 是抽象类 , 当前使用的 onDraw , onDrawOver , getItemOffsets 333 个方法 , 上一篇博客 【RecyclerView】 五、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets ) 二、RecyclerView.ItemDecoration 源码注释解析 中已经分析了 RecyclerView.ItemDecoration 方法 , 并查看了其源码 , 这 333 个方法都是空方法 , 因此这里实现方法时 , 不必再使用 super 调用父类方法 ;

public class ItemDecoration extends RecyclerView.ItemDecoration {@Overridepublic void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull RecyclerView.State state) {}@Overridepublic void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull RecyclerView.State state) {}@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent,@NonNull RecyclerView.State state) {}
}

三、getItemOffsets 设置要点


使用 RecyclerView.ItemDecoration 给 RecyclerView 的 item 设置 " 上 , 下 , 左 , 右 " 444 个边距 , 通过调用 RecyclerView 的 getChildAdapterPosition 方法 , 可以给指定位置的 item 设置不同的边距 ;

这里为 RecyclerView 网格布局设置边距 , 普通的 item 组件上下左右边距都是 555 像素 , 整个网格布局的左侧 , 右侧 边距是 202020 像素 , 网格布局每排 444 个元素 ;

为不同位置的 item 设置不同的边距 , 这里就需要对当前设置边距的位置进行查询与甄别 ;

调用 RecyclerView 对象的 getChildAdapterPosition 方法 , 传入 item 组件 View 参数 , 就可以获取当前的位置 ;

    @Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent,@NonNull RecyclerView.State state) {// 1. 获取当前设置边距的位置int currentPosition = parent.getChildAdapterPosition(view);
}

获取到当前设置位置之后 , 根据不同的位置设置不同的偏移量 ;

表格布局中每行有 444 个元素 ,

所有的元素上下左右边距都设置 555 像素偏移量 , 每行中最左侧的元素距离左边界 202020 像素 , 每行中最右侧元素距离右边界 202020 像素 ;

使用 currentPosition % 4 == 0 可以筛选出每行最左侧的元素 , 使用 currentPosition %4 == 3 可以筛选出每行最右侧的元素 ;

public class ItemDecoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent,@NonNull RecyclerView.State state) {// 1. 获取当前设置边距的位置int currentPosition = parent.getChildAdapterPosition(view);// 2. 针对不同的位置设置不同的边距// 每排最左侧和最右侧的左右边距设置成 20 像素, 其余 4 个边距一律设置成 5if (currentPosition % 4 == 0){// 每排最左侧的边距outRect.left = 20;outRect.top = 5;outRect.right = 5;outRect.bottom = 5;}else if (currentPosition %4 == 3){// 每排最右侧的边距outRect.left = 5;outRect.top = 5;outRect.right = 20;outRect.bottom = 5;}else{// 普通元素的边距都是 5outRect.left = 5;outRect.top = 5;outRect.right = 5;outRect.bottom = 5;}}
}

运行效果 : 下面的 RecyclerView 中每行最左侧元素距离左边距 202020 像素 , 每行最右侧元素距离右边距 202020 像素 , 其余边距都是 555 像素 ;

四、完整代码示例


自定义 RecyclerView.ItemDecoration 代码示例 :

package kim.hsl.recyclerview;import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.View;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;public class ItemDecoration extends RecyclerView.ItemDecoration {@Overridepublic void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull RecyclerView.State state) {}@Overridepublic void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull RecyclerView.State state) {}@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent,@NonNull RecyclerView.State state) {// 1. 获取当前设置边距的位置int currentPosition = parent.getChildAdapterPosition(view);// 2. 针对不同的位置设置不同的边距// 每排最左侧和最右侧的左右边距设置成 20 像素, 其余 4 个边距一律设置成 5if (currentPosition % 4 == 0){// 每排最左侧的边距outRect.left = 20;outRect.top = 5;outRect.right = 5;outRect.bottom = 5;}else if (currentPosition %4 == 3){// 每排最右侧的边距outRect.left = 5;outRect.top = 5;outRect.right = 20;outRect.bottom = 5;}else{// 普通元素的边距都是 5outRect.left = 5;outRect.top = 5;outRect.right = 5;outRect.bottom = 5;}}
}

Java 主界面代码 :

package kim.hsl.recyclerview;import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//1 . 从布局中获取 RecyclerViewRecyclerView recycler_view = findViewById(R.id.recycler_view);//2 . 创建并设置布局管理器//创建布局管理器StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,RecyclerView.VERTICAL);//设置布局管理器recycler_view.setLayoutManager(layoutManager);// 设置边距recycler_view.addItemDecoration(new ItemDecoration());//3 . 创建并设置列表适配器Adapter adapter = new Adapter();recycler_view.setAdapter(adapter);}/*** RecyclerView 适配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + position);}@Overridepublic int getItemCount() {return 10;}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}

运行效果 :

五、RecyclerView 相关资料


官方文档 :

使用 RecyclerView 创建动态列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview

高级 RecyclerView 自定义 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom

代码示例 :

GitHub 源码地址 : https://github.com/han1202012/001_RecyclerView

博客源码快照 : https://download.csdn.net/download/han1202012/14951713

( 使用 Android Studio 打开 )

【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )相关推荐

  1. 【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )

    文章目录 一.RecyclerView.ItemDecoration 简介 1.onDraw() 方法 2.onDrawOver () 方法 3.getItemOffsets () 方法 二.Recy ...

  2. 【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )

    文章目录 一.onDraw 和 onDrawOver 绘制要点 二.onDraw 方法示例 三.onDrawOver 方法示例 四.完整代码示例 五.RecyclerView 相关资料 一.onDra ...

  3. 解决安卓刷新recyclerView时导致itemDecoration分栏标题绘制错乱(重叠和隔空现象)

    安卓的 itemDecoration 装饰器是个好东西,可以与adapter适配器一样闪耀.但是刷新的时候有可能发生重叠绘制或者莫名隔空的BUG. 三.原作 本文分栏标题装饰器的原作者为简书博主end ...

  4. RecyclerView之利用ItemDecoration实现万能分割线

    上一篇文章讲了如何使用ItemDecoration去实现RecyclerView的万能间距,可是很多时候我们的需求里还会有分割线,有时候既要有合适的间距,也要有分割线,这种需求多出现在列表中,也就是网 ...

  5. recyclerview滚动到指定条目

    android recyclerview滚动到指定条目 自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView ...

  6. android view嵌套,Android RecyclerView嵌套RecyclerView点击事件

    RecyclerView嵌套RecyclerView点击事件遇到取值错乱的问题 其实问题根本就是咱们没有处理好被嵌套的那层recycleview的position 那么解决思路也很简单,想办法把被嵌套 ...

  7. 【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )

    文章目录 一.RecyclerView 简介 二.RecyclerView 特点 三.RecyclerView 涉及到的类 四.RecyclerView 相关资料 一.RecyclerView 简介 ...

  8. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  9. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

最新文章

  1. GDAL Data Model(转)
  2. 算法---------寻找重复的子树(Java版本)
  3. pandas布尔索引
  4. 页面事务处理 ContextUtil.SetComplete(); 没有 MTS 对象上下文
  5. Spring与Oauth2整合示例 spring-oauth-server
  6. LeetCode刷题: 整数反转
  7. unittest读取ddt之-元组,嵌套元组,字典
  8. 测试管理 | 测试经理定义和实施测试度量
  9. java中集合(List)的嵌套分配值、移除等操作
  10. 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
  11. 自己来实现一套IOC注解框架
  12. Axure 画原型图
  13. 计算机基础频率单位转换,hz换算(hz与秒单位换算)
  14. 基于微信小程序的音乐播放器设计
  15. 洛谷——P1238 走迷宫
  16. mysql如何查询昨天的数据
  17. Joshua Bloch离开Google了,Dart前景堪忧
  18. idea怎么给类和方法自动快速添加注释的方法(/**@return @Param*/)
  19. 吲哚菁绿-氨基|1686147-55-6|ICG-NH2,ICG-Amine|近红外荧光染料
  20. edius导出html,每次用EDIUS使用素材后生成的ewc2文件讲解及清理方法

热门文章

  1. Java常用工具类---IP工具类、File文件工具类
  2. 表迁移工具的选型-复制ibd的方法-传输表空间
  3. sed编辑器: 非交互
  4. 201521123060 《Java程序设计》第10周学习总结
  5. MyEclipse 15 集成SVN
  6. C: Answers to “The C programming language, Edition 2”
  7. C#反射读取和设置实体类的属性
  8. vs.net设计器里加载派生窗口类时要执行父窗口的Form_Load方法
  9. 纯CSS实现多级菜单,兼容IE6
  10. css3属性box-sizing:border-box 用法解析