1-VII-RecyclerView基本使用
零、前言
[1].RecyclerView可以说是现在安卓视图的一哥了
[2].加包implementation 'com.android.support:design:26.1.0'
[3].RecyclerView的布局样式、装饰线
一、代码实现
1.Activity布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_below="@+id/ll" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
2.准备条目布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp"> <ImageView android:id="@+id/iv_icon" android:layout_width="40dp" android:layout_height="40dp" android:src="@mipmap/head"/> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="@dimen/dp_16" android:layout_marginLeft="3dp" android:layout_toRightOf="@+id/iv_icon" android:text="Content" android:textAllCaps="false" android:textColor="#000000"/> </RelativeLayout>
3.创建视图持有者:FirstViewHolder
/** * 作者:张风捷特烈 * 时间:2018/3/19:13:51 * 邮箱:1981462002@qq.com * 说明:ViewHolder */ public class FirstViewHolder extends RecyclerView.ViewHolder { public final ImageView mIv_icon; public final TextView mTv_title; /** * itemView为MyViewHolder中onCreateViewHolder加载的布局 * @param itemView 条目 */ public FirstViewHolder(View itemView) { super(itemView); mIv_icon = itemView.findViewById(R.id.iv_icon); mTv_title = itemView.findViewById(R.id.tv_title); } }
4.创建适配器类
/** * 作者:张风捷特烈<br/> * 时间:2018/8/30 0030:10:18<br/> * 邮箱:1981462002@qq.com<br/> * 说明:RecyclerView适配器 */ public class FirstRvAdapter extends RecyclerView.Adapter<FirstViewHolder> { private Context mCtx; private ArrayList<String> data; public FirstRvAdapter(Context ctx,ArrayList<String> data) { mCtx = ctx; this.data = data; } /** * 相当于getView方法中创建View和ViewHolder * * @param parent 父容器 * @param viewType 类型 * @return ViewHolder */ @Override public FirstViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //加载布局文件 View itemView = LayoutInflater.from(mCtx).inflate(R.layout.item_rv, null); return new FirstViewHolder(itemView); } /** * 相当于getView 绑定数据部分的代码 * @param holder ViewHolder * @param position 位置 */ @Override public void onBindViewHolder(FirstViewHolder holder, int position) { String mData = data.get(position); holder.mTv_title.setText(mData); } @Override public int getItemCount() { return data.size(); } }
5.Activity中使用的核心代码:
//初始化数据 mData = DataUtils.getRandomName(30, true); //2.设置适配器 mRecyclerView.setAdapter(new FirstRvAdapter(this,mData)); //3.!!创建布局管理器 mLlm = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); //4.!!!设置布局管理器 mRecyclerView.setLayoutManager(mLlm);
[1].要设置布局管理器,不然无效果
[2].费了这么大的劲,就搞出一个没有线的不能点击的ListView?
[3].一开始也觉得,这也不比ListView好哪去啊,别急,且往下看
6.网格布局:(上下文,每行(列)条目数,方向,是否倒序排列)
mGLM = new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(mGLM);
两步就搞定了:
7.瀑布流:(每行(列)条目数,方向)
mSGM = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mSGM);
RecyclerView能对布局的条目进行控制,者也是它强大之处
二、装饰线
1.添加装饰线
mRecyclerView.addItemDecoration(//横线 new RecycleViewDivider(this,LinearLayoutManager.VERTICA)); mRecyclerView.addItemDecoration(//竖线 new RecycleViewDivider(this,LinearLayoutManager.VERTICAL));
2:可以自定义分割线形状,作为第三参数
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="@dimen/dp_4" /> <size android:width="@dimen/dp_8" /> <solid android:color="@color/aliceblue" /> </shape>
2.不重复造轮子了,网上找的一款装饰线类
有一点是每一个条目都绘制全RecyclerView长宽,绘制了很多不必要的线
不过在RecycleViewDivider里我暂时得不到给个view的尺寸...加个TODO吧,先凑合着用以后完善
public class RecycleViewDivider extends RecyclerView.ItemDecoration { private Paint mPaint; private Drawable mDivider; private int mDividerHeight = 2;//分割线高度,默认为1px private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL private 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 dividerHeight 分割线高度 * @param dividerColor 分割线颜色 */ public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) { this(context, orientation); mDividerHeight = dividerHeight; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(dividerColor); mPaint.setStyle(Paint.Style.FILL); } /** * 获取分割线尺寸 * * @param outRect 线的矩框 * @param view 线 * @param parent RecyclerView * @param state 状态 */ @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state){ super.getItemOffsets(outRect, view, parent, state); //TODO if (mOrientation == LinearLayoutManager.VERTICAL) { outRect.set(0, 0, 0, mDividerHeight);//横线矩框 } else { outRect.set(0, 0, mDividerHeight, 0);//竖线矩框 } } /** * 绘制分割线 * * @param c 画布 * @param parent RecyclerView * @param state 状态 */ @Override public 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);//竖线矩框 } } /** * 绘制纵向列表时的分隔线 这时分隔线是横着的 * 每次 left相同,top根据child变化,right相同,bottom也变化 * * @param canvas 画布 * @param parent RecyclerView */ private void drawVertical(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); } } } /** * 绘制横向列表时的分隔线 这时分隔线是竖着的 * l、r 变化; t、b 不变 * * @param canvas 画布 * @param parent RecyclerView */ private void drawHorizontal(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); } } } }
后记、
1.声明:
[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力
2.连接传送门:
更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com
3.联系我
QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328
4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
react native 友盟统计 IOS 端集成
react native 友盟统计的Android端集成可参考 :https://www.jianshu.com/p/1c41d4b66312 希望大家少走些弯路吧。 下面介绍下IOS 端的集成: 步骤 ios端的sdk集成 ios 和rn 的交互类 工程的相关配置 (初始化sdk) rn 端调用 1.sdk 集成部分 官网sdk下载地址:https://developer.umeng.com/sdk/reactnative?spm=a211g2.211692.0.0.28961183UCQLCq 把人家封装的交互类也下载下来: image.png ios下载下来 解压后得到这些文件 image.png 把这些 解压后的framework 导入到工程 UMAnalytics.framework UMCommon.framework UMCommonLog.framework UMCommonLog.bundle image.png image.png 以此把上面的包导入即可,完成集成部分。 2. ios 和rn 的交互类 把官网下载下来解压后的react native 交互代码 拷贝到...
- 下一篇
推荐Android两种屏幕适配方案
前言 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。本文将推荐两种屏幕适配方案,大家可以根据实际情况使用。 传统dp适配方式的缺点 android中的dp在渲染前会将dp转为px,计算公式: px = density * dp; density = dpi / 160; px = dp * (dpi / 160); 而dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的。 屏幕尺寸、分辨率、像素密度三者关系 通常情况下,一部手机的分辨率是宽x高,屏幕大小是以寸为单位,那么三者的关系是: 举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。 这样会存在什么问题呢? 假设我们UI设计图是按屏幕宽度为360dp来设计的,那么在上述设备上,屏幕宽度其实为1080/(440/160)=392.7dp,也就是屏幕是比设计图要宽的。这种情况下...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果