ViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
class MyViewHolder extends ViewHolder {
TextView textView;
public MyViewHolder(View view) {
super(view);
textView = (TextView) view.findViewById(R.id.tview);
}
}
}
class MyDecor extends ItemDecoration {
//定义一个水平和竖直常量
private final int Horization = RecyclerView.HORIZONTAL;
private final int Vertical = RecyclerView.VERTICAL;
//创建一个int型的数组,在数组中存放android中自带的分割线
private int [] attrs = {android.R.attr.listDivider};
//声明一个图片对象
private Drawable drawable;
//声明一个RecyclerView的方向
private int oritation;
public MyDecor (Context context,int orization){
TypedArray array = context.obtainStyledAttributes(attrs);
drawable = array.getDrawable(0);
//让这个属性重复使用
array.recycle();
//判断方向
if (orization != Horization && orization != Vertical) {
//如果既不是水平又不是竖直的,抛出异常
throw new IllegalArgumentException(“没有该方向”);
}else {
oritation = orization;
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, State state) {
// TODO Auto-generated method stub
super.onDraw(c, parent, state);
if (oritation == Vertical) {
drawHor(c, parent);
}
}
@Override
@Deprecated
public void getItemOffsets(Rect outRect, int itemPosition,
RecyclerView parent) {
// TODO Auto-generated method stub
super.getItemOffsets(outRect, itemPosition, parent);
}
//新建一个方法,在水平方向画一条线
public void drawHor(Canvas canvas,RecyclerView recyclerView){
int left = recyclerView.getPaddingLeft();
int right = recyclerView.getWidth()-recyclerView.getPaddingRight();
int childCount = recyclerView.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = recyclerView.getChildAt(i);
//获取item上view视图的参数对象
RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams();
//根据参数对象获取参数值
int top =child.getBottom() + params.bottomMargin;
//设置bottom坐标
int bottom = top + drawable.getIntrinsicHeight();
drawable.setBounds(left, top, right, bottom);
//画到花板上
drawable.draw(canvas);
}
}
}
这个就是画分割线的方法,我在这里用了内部类的写法,但是不建议这种写法,这样写代码不仅繁杂,还不规范。
在mainactivity中就是进行一系列的查找控件和一些属性的设置,adapter其实和上一篇是一致的,重要的部分就是MyDecor类。
说到这个MyDecor类,就要说一下ItemDecoration
ItemDecoration该类为抽象类,官方目前并没有提供默认的实现类
里面封装了三个方法: (1)void getItemOffsets () (2)void onDraw () (3)void onDrawOver ()
onDraw方法先于drawChildren
onDrawOver在drawChildren之后,一般我们选择复写其中一个即可。
getItemOffsets 可以通过outRect.set()为每个Item设置一定的偏移量,主要用于绘制Decorator。
当我们调用mRecyclerView.addItemDecoration()方法添加decoration的时候,RecyclerView在绘制的时候,去会绘制decorator,即调用该类的onDraw和onDrawOver方法。
我们使用recyclerview的时候,如果没有设置显示条目的margin,或者padding的话,是没有分割线效果的。 那么除去使用margin或padding,其余的方法是用itemdecoration绘制分割线我们绘制分割线的时候通常会使用drawable去绘制,那个drawable是怎么得到的呢?
方法1:可以使用android自带的属性:android.R.attr.listDivider属性可以获得,那么获得drawable的方法是:
首先获得TypedArray对象,这个是存储属性的一个容器,得到方法是
context.obtainStyledAttributes(int类型数组)
private int[]mDrawableId={android.R.attr.listDivider};
TypedArray ta = mContext.obtainStyledAttributes(mDrawableId);
然后,在从这个属性容器中去得到对应得drawable得到方法是:
Drawable mDrawable=ta.getDrawable(0);
然后再通过重写ItemDecoration中的onDrawOver的方法去书写你的分割线即可。
我现在拿画横线来说,从上面这个图中,我们很容易就可以看到,我们画分隔线的位置,是在每一个Item的布局之间。
我们确定了画在哪里,那我们怎么确定画线的具体的坐标位置呢?也就是我们要确定:分隔线的left, top, right, Bottom. 在Adapter中,我们很容易通过parent(这个parent它其实就是我们能看到的部分)获取每一个childView: (1)left:parent.getPaddingLeft() (2)right: parent. getWidth()-parent.getPaddingRight(); (3)top : 就是红线的上面:我们通过ChildView.getBottom()来得到这个Item的底部的高度,也就是蓝线位置,蓝线和红线之间间距:就是这个Item布局文件的:layout_marginBottom, 然后top的位置就是两者之和。 (4)bttom: 就是top加上分隔线的高度:top+线高。
以上就是recyclerview设置分割线的介绍。
效果图如下:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
【Android 详细知识点思维脑图(技能树)】
我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
最后,赠与大家一句话,共勉!
述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-PrB5SPVk-1711628045275)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
最后,赠与大家一句话,共勉!