Android之RecyclerView简单使用(三)
使用过ListView滴小伙伴都知道。ListView有这样一个属性android:divider,用来设置每一个item之间切割线滴属性。问题来了,那么RecyclerView这个控件有没有这个属性呢,尝试了一下,没有这个属性。可是RecyclerView有这种方法mLinearRecycler.addItemDecoration(),用来加入切割线滴。以下是这部分源代码:
public static abstract class ItemDecoration {
public void onDraw(Canvas c, RecyclerView parent, State state)
{
onDraw(c, parent);
}
public void onDrawOver(Canvas c, RecyclerView parent, State state)
{
onDrawOver(c, parent);
}
@Deprecated
public void getItemOffsets(Rect outRect, int itemPosition,RecyclerView parent)
{
outRect.set(0, 0, 0, 0);
}
public void getItemOffsets(Rect outRect, View view,RecyclerView parent, State state)
{
getItemOffsets(outRect, ((LayoutParams)view.getLayoutParams()).getViewLayoutPosition(), parent);
}
}
RecyclerView在调用addItemDecoration()滴时候就会去绘制decoration,通过源代码我们会发现,会调用里面的onDraw()和onDrawOver()方法。而getItemOffsets(),是为每一个Item设置一定的偏移量。主要用于绘制decorator。
以下我们来看一下该类的实现,代码例如以下:
package recyclerview.hy.com.myrecyclerview.decoration;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import recyclerview.hy.com.myrecyclerview.R;
/**
* Created by Ying on 2016/2/16.
*/
public class ListItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDrawable;
private final static int DEFAULT_ORENTATION = LinearLayoutManager.VERTICAL;
private int mOrientation;
public ListItemDecoration(Context context, int orientation) {
if (orientation != LinearLayoutManager.HORIZONTAL && orientation != LinearLayoutManager.VERTICAL) {
//方法一:假设没设置布局显示方向,默认设置为垂直方向
this.mOrientation = DEFAULT_ORENTATION;
//方法二:抛出异常,提示设置布局方向
// throw new IllegalArgumentException("invalid orientation");
} else {
this.mOrientation = orientation;
}
//设置切割线样式
mDrawable = context.getResources().getDrawable(R.drawable.divider);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == LinearLayoutManager.HORIZONTAL) {
drawHorizontal(c, parent);
} else {
drawVertical(c, parent);
}
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams();
int left = child.getRight() + params.rightMargin;
int right = left + mDrawable.getIntrinsicHeight();
mDrawable.setBounds(left, top, right, bottom);
mDrawable.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDrawable.getIntrinsicHeight();
mDrawable.setBounds(left, top, right, bottom);
mDrawable.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == DEFAULT_ORENTATION) {
outRect.set(0, 0, 0, mDrawable.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDrawable.getIntrinsicWidth(), 0);
}
}
}
这样就实现了切割线的类,我们仅仅要在Activity中加入这样一句话就可以:
mLinearRecycler.addItemDecoration(new ListItemDecoration(this, LinearLayoutManager.VERTICAL));
看一下效果图:
假设你想设置其他样式滴切割线仅仅需在这句话进行改动:
mDrawable = context.getResources().getDrawable(R.drawable.divider);
关于RecyclerView实现GridView和瀑布流效果就不在贴代码了。这些代码demo里面有。
看一下效果图:
GridView:
瀑布流:
关于瀑布流背景点击变色,假设有疑惑,能够參考我滴还有一篇博客Android之简单改变button颜色方案。
项目代码:demo下载地址
如有疑问。记得给我留言哦~技术交流嘛~~喜欢滴,顶一下呗!
Android之RecyclerView简单使用(三)的更多相关文章
- android中的简单animation(三)accelerate(加速),decelerate(减速),anticipate,overshoot,bounce
animation_3.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- [Android]使用RecyclerView替代ListView(三)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html 这次来使用RecyclerView实现Pinn ...
- [Android]使用RecyclerView替代ListView(二)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html 以前写过一篇“[Android]使用Adapte ...
- [Android]使用RecyclerView替代ListView(一)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html RecyclerView是一个比List ...
- Android开发——RecyclerView特性以及基本使用方法(一)
)关于点击事件,没有像ListView那样现成的API,但是自己封装起来也不难,而且我们使用ListView时,如果item中有可点击组件,那么点击事件的冲突也是一个问题,而在RecyclerView ...
- ANDROID L——RecyclerView,CardView进口和使用(Demo)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...
- Android开发——RecyclerView实现下载列表
本篇记录的是使用Jsoup框架爬取网页内容,结合Android的RecyclerView,从而实现批量下载小说的功能(也是我的APP星之小说下载器Android版的核心功能),思路仅供参考 本文使用了 ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android笔记——RecyclerView替代ListView
ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...
随机推荐
- 1.STL list
初始化一个链表 list<,,,, }; 链表排序 mylist.sort(); 链表反转 mylist.reverse(); 链表删除头部和尾部 mylist.pop_back();//删除尾 ...
- ATcoderARC100D Equal Cut
ARC100 D - Equal Cut Description: 给出长度为n的序列A,把这个序列分成连续的四段,最小化极差. \(4≤n≤2×10^5,4≤n≤2×10^5\) Solution: ...
- 如何优雅的写UI——(2)MFC下基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- OSI模型与TCP/IP协议族
OSI模型与TCP/IP协议族 年之后,TCP/IP协议族逐渐成为占主导的商用体系结构,广泛应用于Internet中,并通过广泛的測试.而OSI模型从来没有被全然实现过. 一.OSI模型: OSI与I ...
- opera mini 改服
opera mini 改服 下载 opera 和 opera mini ftp://ftp.opera.com/pub/opera/android/mini/ ftp://ftp.opera.com/ ...
- Qt之输出控制
简述 在Qt项目开发过程中,往往需要对程序的一些信息进行控制,比如:打印日志.调试信息等,便于我们后期查找.跟踪及定位问题. 下面,我们来分享下常用的几种方式. 简述 示例代码 应用程序输出 控制台输 ...
- 数据库中解析XML
简介:OPENXML方法使用一例实现导入功能 DECLARE @strProjGUID AS VARCHAR(50) DECLARE @strProjCode AS VARCHAR(50) DEC ...
- Maven用法
Maven 的使用教程 1.什么是 Maven? Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 2.下载 Maven? ①.官网下载 ...
- Vue前后端分离常用JS函数点(一)
1.筛选过滤:array.filter(function(val){}); 会把array中符合规则的数组元素按array里面的元素顺序保留下来. // 官方解释:按返回true或者false,把不 ...
- Linux的用户和组管理
1.用户和组 一个用户必须有一个主组 一个用户可以同时属于多个组 一个组可以拥有多个用户 用户信息存在: /etc/passwd 组信息存在:/etc/group 密码信息存在: /etc/shado ...