一、RecycleView 分割线

ListView中的分割线可以通过属性divider和dividerHeight分别设置颜色值/图片及分割线高度。而RecycleView并没有提供这两个属性设置分割线。
作为ListView的升级版列表控件,当然也是支持分割线的设置的。RecycleView分割线需要通过addItemDecoration(ItemDecoration decor)设置;

ItemDecoration有3个方法,ItemDecoration并没有对其实现,需要我们自己实现自定义的分割线;
onDraw:其绘制将会在每个Item被绘制之前进行;
onDrawOver:在绘制完Item后进行绘制;
getItemOffsets:通过outRect.set()为每个item设置偏移量。

下面是网上提供的通用分割线实现类,可以根据自己不同需求做修改;

public class RecycleViewDivider extends RecyclerView.ItemDecoration {private Paint mPaint;private Drawable mDivider;private int mDividerHeight = 2;//分割线高度,默认为2pxprivate int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTALprivate static final int[] ATTRS = new int[]{android.R.attr.listDivider};/*** 默认分割线:高度为2px,颜色为灰色** @param context* @param orientation 列表方向*/public RecycleViewDivider(Context context, int orientation) {if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {throw new IllegalArgumentException("请输入正确的参数!");}mOrientation = orientation;final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}/*** 自定义分割线** @param context* @param orientation 列表方向* @param drawableId  分割线图片,高度默认为图片原始高度*/public RecycleViewDivider(Context context, int orientation, int drawableId) {this(context, orientation);mDivider = ContextCompat.getDrawable(context, drawableId);mDividerHeight = mDivider.getIntrinsicHeight();}/*** 自定义分割线** @param context* @param orientation 列表方向* @param drawable    分割线图片,高度默认为图片原始高度*/public RecycleViewDivider(Context context, int orientation, Drawable drawable) {this(context, orientation);mDivider = drawable;mDividerHeight = mDivider.getIntrinsicHeight();}/*** 自定义分割线** @param context* @param orientation 列表方向* @param drawable    分割线图片* @param drawableHeight    分割线图片高度*/public RecycleViewDivider(Context context, int orientation, Drawable drawable, intdrawableHeight) {this(context, orientation);mDivider = drawable;mDividerHeight = drawableHeight;}/*** 自定义分割线** @param context* @param orientation   列表方向* @param dividerHeight 分割线高度* @param dividerColor  分割线颜色*/public RecycleViewDivider(Context context, int orientation, int dividerHeight, intdividerColor) {this(context, orientation);mDividerHeight = dividerHeight;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(dividerColor);mPaint.setStyle(Paint.Style.FILL);}//获取分割线尺寸@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.Statestate) {super.getItemOffsets(outRect, view, parent, state);outRect.set(0, 0, 0, mDividerHeight);}//绘制分割线@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {super.onDraw(c, parent, state);if (mOrientation == LinearLayoutManager.VERTICAL) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}//绘制横向 item 分割线private void drawHorizontal(Canvas canvas, RecyclerView parent) {final int left = parent.getPaddingLeft();final int right = parent.getMeasuredWidth() - parent.getPaddingRight();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + layoutParams.bottomMargin;final int bottom = top + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}}//绘制纵向 item 分割线private void drawVertical(Canvas canvas, RecyclerView parent) {final int top = parent.getPaddingTop();final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + layoutParams.rightMargin;final int right = left + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}}
}

这里设置横向图片分割线,分割线的高度默认为图片高度;

 mRecyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL, R.mipmap.divier_img));

二、RecycleView 监听滚动状态、及顶部/末尾位置

还记得ListView是如何监听滚动到顶部或末尾的吗?通过设置setOnScrollListener实现的;

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stubif (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {// 滚动停止}else if (scrollState==OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {// 手指滚动状态}else if (scrollState==OnScrollListener.SCROLL_STATE_FLING) {// 手指不动了,但是屏幕还在滚动状态,靠惯性滚动}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stubif (firstVisibleItem==0) {// 滚动到顶部}else if (firstVisibleItem+visibleItemCount>= totalItemCount) {// 滚动到尾部}}
});

在RecycleView中,可以通过线性布局对象LinearLayoutManager监听顶部/尾部位置;
其提供以下方法(主要区别是item是否完全显示,还是存在一半被遮挡);
findFirstVisibleItemPosition() :第一个显示的item位置;
findFirstCompletelyVisibleItemPosition() :第一个完全显示的item位置;
findLastVisibleItemPosition() :最后一个显示的item位置;
findLastCompletelyVisibleItemPosition():最后一个完全显示的item位置。

接着设置滚动监听setonScrollListener,然后对第一个显示的item位置和末尾显示的item位置判断是否滚动到屏幕开始/末尾。

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {// TODO Auto-generated method stubif (!(mLayoutManager instanceof LinearLayoutManager)) {Toast.makeText(MainActivity.this, "不是线性的布局结构", Toast.LENGTH_SHORT).show();return;}LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mLayoutManager;if (linearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {Toast.makeText(MainActivity.this, "滚动到顶部", Toast.LENGTH_SHORT).show();}if (linearLayoutManager.findLastCompletelyVisibleItemPosition() == mRecyclerView.getAdapter().getItemCount() - 1) {Toast.makeText(MainActivity.this, "滚动到尾部", Toast.LENGTH_SHORT).show();}}@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {// TODO Auto-generated method stubif (newState==RecyclerView.SCROLL_STATE_IDLE){Toast.makeText(MainActivity.this, "滚动停止", Toast.LENGTH_SHORT).show();}else if (newState == RecyclerView.SCROLL_STATE_DRAGGING){Toast.makeText(MainActivity.this, "手指拖动", Toast.LENGTH_SHORT).show();}else if (newState==RecyclerView.SCROLL_STATE_SETTLING){Toast.makeText(MainActivity.this, "手指离开屏幕,滑动", Toast.LENGTH_SHORT).show();}}});

RecycleView 分割线设置及监听滚动状态相关推荐

  1. Vue 设置overflow: auto 后监听滚动距离

    overflow: auto 后监听滚动距离 <div class="page-body-inner" @scroll.passive="getScroll($ev ...

  2. android 充电监听,Android_Android判断和监听底座状态和类型的方法介绍,底座的状态跟充电状态类似, - phpStudy...

    Android判断和监听底座状态和类型的方法介绍 底座的状态跟充电状态类似,很多底座提供充电功能(座充). 底座状态同样使用sticky Intent广播.可以查询设备是否插入底座,哪种底座. 判断当 ...

  3. android 2.1 监听电话状态并自动接听来电

    一.开发环境       Elispse5.5,JDK1.6,Aadroid 2.1 二.开发中使用到的重点技术点:       距离感应(SENSOR_SERVICE ),音讯管理(AUDIO_SE ...

  4. 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )

    文章目录 前言 一.移除顶部状态栏空白 二.帧布局组件 三.透明度组件 四.监听滚动事件 五.完整代码示例 六.相关资源 前言 在上一篇博客 [Flutter]Banner 轮播组件 ( flutte ...

  5. 页面滚动到某一位置吸顶_vue监听滚动事件某元素吸顶或固定位置显示详解

    本文主要为大家详细介绍了vue实现某元素吸顶或固定位置显示,监听滚动事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 最近写了一个VUE的web app项目,需要实现某个部位 ...

  6. 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  7. Android Glide加载图片、网络监听、设置资源监听

    Glide加载图片.加载进度监听 前言 正文 一.项目配置 二.显示网络图片 三.添加设置资源监听 四.添加设置资源监听 五.添加加载进度条 六.封装工具类 七.源码 总结 前言   在日常开发中使用 ...

  8. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  9. 监听电话状态并自动接听来电

    在完成全部功能之前,我查询了很多资料,用了一个星期的时间终于陆陆续续的将这些功能全部完成了,为了众多和我一样的菜鸟少走一点弯路,我决定将它贴出来和大家一起分享,仔细一看距上次更新博客已经有半年了 . ...

最新文章

  1. python获取天气分析_Python爬取南京市往年天气预报,使用pyecharts进行分析
  2. 【C语言】算数操作符 移位操作符 以及 sizeof单目操作符讲解
  3. windows 7 在使用无线路由或者插线出现×××感叹号排除方法
  4. php7和7.1,PHP7.0和7.1 部分新增特性备忘代码分享
  5. Linux C :系统调用-fork,wait,subreaper
  6. 公用技术——设计模式5——创建型模式——建造者模式——待补充
  7. python拼图游戏_乐趣无穷的Python课堂
  8. java 继承示例_Java中的继承类型以及示例
  9. SEO网站优化团队官网模板
  10. P2419 [USACO08JAN]牛大赛Cow Contest
  11. CDN(Content Delivery Network)
  12. linux 配置root环境变量,root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题...
  13. c++中 vs 简单的对txt文件读写
  14. android的绝对布局,Android布局之绝对布局AbsoluteLayout详解
  15. LNK2005 解决方法以及发生原因
  16. 618网购盛宴开启,容联AI+CC为企业构建电商“新基建”中台
  17. 鲁大师从服务器获取信息失败怎么办,云服务器 鲁大师
  18. 谷歌地图实现车辆位置实时跟踪
  19. c语言中chat的使用方法图解,Mechat
  20. 详解Linux运维工程师应具备的十大技能

热门文章

  1. 心理服务平台微信小程序的设计与实现-计算机毕业设计
  2. 计算机科学领域几个常用的期刊
  3. 计算机应用专业毕业求职信,计算机应用专业毕业生求职信范文
  4. 安卓记账APP的开发思路详解
  5. Linux Mint 19 下体验Vagrant +VirtualBox
  6. 手机能承受的drawcall 怎么算?
  7. 新东方APP技术架构演进, C端技术经验分享
  8. 转:QT时间相关的使用(日期相减问题)
  9. python3 byte转string_python3.x 将byte转成字符串的方法
  10. 如何成为一名企业真正需要的WebGIS开发工程师