android中RecyclerView的简单使用(二)——分割线(1),附赠课程+题库

}

MyAdapter adapter = new MyAdapter(MainActivity.this, list);

//将适配器放到recyclerView上

//创建线性布局管理者对象

LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this);

//StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,

// RecyclerView.VERTICAL);

//通过manager对象设置显示方向

manager.setOrientation(RecyclerView.VERTICAL);

//将管理者对象给recyclerView

recyclerView.setLayoutManager(manager);

recyclerView.setAdapter(adapter);

recyclerView.addItemDecoration(new MyDecor(MainActivity.this, RecyclerView.VERTICAL));

}

}

class MyAdapter extends RecyclerView.Adapter {

// 声明两个属性,接收传递过来的数据

private Context context;

private ArrayList list;

private MyViewHolder viewHolder;

// 创建一个构造方法,将数据和activity的上下文传递过来

public MyAdapter(Context context, ArrayList list) {

this.context = context;

this.list = list;

}

// 返回显示的条目个数

@Override

public int getItemCount() {

// TODO Auto-generated method stub

return list.size();

}

@Override

public void onBindViewHolder(ViewHolder arg0, int arg1) {

// 将父类的对象强转为子类对象

// MyViewHolder myViewHolder = (MyViewHolder) arg0;

if (arg0 instanceof MyViewHolder) {

viewHolder = (MyViewHolder) arg0;

}

String ss = list.get(arg1);

viewHolder.textView.setText(ss);

}

// 创建viewholder对象,并将对象返回

@Override

public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {

View view = LayoutInflater.from(context).inflate(R.layout.re, null);

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);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值