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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL数据库在高并发下的优化方案
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)