RecylerView通用分隔线实现
来源:互联网 发布:网络歌曲被下架 编辑:程序博客网 时间:2024/05/01 21:03
前面使用了recyclerview的分隔线的最简实现法。
但是对于一些比较特殊的需求,可能是办不到的,比如设置一张图片最为分隔线,自定义drawable文件,作为分隔线等等。
前面最简实现法不过是重写getItemOffsets方法,这里我们需要实现通用的分隔线,那么还需要复写一个方法,就是onDraw方法,这才是真正画出分隔线的方法。
废话不多说,直接上代码:
@Override
public void onDraw(Canvas c,RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
//开始 画线
//可以在这里判断 是画水平的线 还是 画垂直的线
switch (mOrientation) {
caseVertical:
drawVerticalLine(c, parent);
break;
caseHorizontal:
drawHorizontalLine(c,parent);
break;
}
}
这里有水平布局,和垂直布局的区别,当然分隔线的画法也是不同的咯。
垂直画法:
private void drawVerticalLine(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); int left = childView.getLeft() - childView.getPaddingLeft(); int right = childView.getRight() - childView.getPaddingRight(); int top = childView.getBottom() + childView.getPaddingBottom(); int bottom = top + mDividerSize; mDivier.setBounds(left, top, right, bottom); mDivier.draw(c); }}
简单的说,不过就是把设置进来的Dawable对象,设置大小,画到画布上而已。
水平画法:
private void drawHorizontalLine(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); int left = childView.getLeft() + childView.getPaddingLeft(); int right = left + mDividerSize; int top = childView.getTop() - childView.getPaddingTop(); int bottom = childView.getBottom() - childView.getPaddingBottom(); mDivier.setBounds(left, right, top, bottom); mDivier.draw(c); }}
mDrivider由外部注入,默认是android:listDivider。
@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { switch (mOrientation) { case Vertical: outRect.set(0, 0, 0, mDividerSize); break; case Horizontal: outRect.set(0, 0, mDividerSize, 0); break; }}
这里的mDividerSize 由外部注入,默认为1。
这样子,相对于前面的最简写法的更通用了。
package recyclerview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ListView;/** * Created by javalong on 2015/12/20 0020. */public class MyItemDecoration extends RecyclerView.ItemDecoration { enum Orientation { Vertical, Horizontal } private Context mContext; private Orientation mOrientation; private Drawable mDivier; private int mDividerSize = 1; public MyItemDecoration(Context context, Orientation orientation) { mContext = context; mOrientation = orientation; setDefaultDivier(); } //默认的 divider 就用在 listDivier里面设置的 private void setDefaultDivier() { TypedArray typedArray = mContext.obtainStyledAttributes(new int[]{android.R.attr.listDivider}); int resId = typedArray.getResourceId(0, android.R.attr.listDivider); if (resId != 0) { mDivier = typedArray.getResources().getDrawable(resId); } else { mDivier = typedArray.getDrawable(android.R.attr.listDivider); } typedArray.recycle(); } //向外提供接口,可以直接注入 public void setDivier(Drawable divier) { this.mDivier = divier; } public void setDividerSize(int dividerSize) { this.mDividerSize = dividerSize; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); //开始 画线 //可以在这里判断 是画水平的线 还是 画垂直的线 switch (mOrientation) { case Vertical: drawVerticalLine(c, parent); break; case Horizontal: drawHorizontalLine(c, parent); break; } } private void drawHorizontalLine(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); int left = childView.getLeft() + childView.getPaddingLeft(); int right = left + mDividerSize; int top = childView.getTop() - childView.getPaddingTop(); int bottom = childView.getBottom() - childView.getPaddingBottom(); mDivier.setBounds(left, right, top, bottom); mDivier.draw(c); } } private void drawVerticalLine(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); int left = childView.getLeft() - childView.getPaddingLeft(); int right = childView.getRight() - childView.getPaddingRight(); int top = childView.getBottom() + childView.getPaddingBottom(); int bottom = top + mDividerSize; mDivier.setBounds(left, top, right, bottom); mDivier.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { switch (mOrientation) { case Vertical: outRect.set(0, 0, 0, mDividerSize); break; case Horizontal: outRect.set(0, 0, mDividerSize, 0); break; } }}
0 0
- RecylerView通用分隔线实现
- RecylerView 中添加分隔线
- css实现分隔线
- recylerView
- RecylerView
- recylerview~
- RecylerView
- RecylerView内部实现ItemClick事件
- GridView分隔线的实现
- 巧用TextView实现分隔线
- Android GridView分隔线实现
- 用recylerView实现瀑布流的效果
- RecylerView 实现流布局StaggeredGridLayoutManager使用
- RecylerView实现下拉到底加载更多数据
- RecylerView实现多种复杂条目类型布局
- Android RecylerView之万能适配器的实现
- 使用RecylerView实现瀑布流图片
- CSS HTML 实现虚线横线分隔线
- org.hibernate.TransientObjectException: The given object has a null identifier;
- python sort函数
- 每天学点Python之list
- VC6.0和相应的插件安装
- C的经典算法
- RecylerView通用分隔线实现
- 【Java基础】——JDBC
- 每天学点Python之数值类型
- 提取pdf文件文本:pdfparser与xpdf具体操作
- java 效率编程(创建对象)
- gem5: 缓存中如何设置writeback dirty cachelines并invalidate该缓存块
- TopCoder SRM676 Div. 2 Problem 550 - BoardEscapeDiv2
- PHP 构建通信服务器
- 减少VoIP时延的方法