Android 中 RecyclerView 的基本使用

  • 1. 垂直布局
    • 1.1 基本使用
    • 1.2 点击事件
  • 2. 水平布局
  • 3. 网格布局
  • 4. 瀑布流
  • 5. 样式

RecyclerView 能够灵活实现大数据集的展示, 视图的复用管理比 ListView 更好, 能够显示列表、网格、瀑布流等形式, 且不同的 ViewHolder 能够实现 item 多元化的功能.

但是使用起来会稍微麻烦一点, 并且没有类似 ListView 的 onItemClickListene r监听事件, 需要开发者自己实现.

新版本不用导入下面依赖的

implementation 'com.android.support:cardview-v7:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'

1. 垂直布局

1.1 基本使用

LinearRecyclerViewActivity

package com.example.hello.recyclerView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;import com.example.hello.R;public class LinearRecyclerViewActivity extends AppCompatActivity {// 声明private RecyclerView rv1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_linear_recycler_view);// 获取rv1 = findViewById(R.id.rv_1);rv1.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));// 添加分割线rv1.addItemDecoration(new Decoration());rv1.setAdapter(new LinearViewAdapterActivity(LinearRecyclerViewActivity.this));}/*** 设置分割线*/class Decoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));}}
}

outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
这句中的 dividerHeight 来自文件 dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="dividerHeight">2dp</dimen>
</resources>

activity_linear_recycler_view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".recyclerView.LinearRecyclerViewActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_1"android:layout_width="match_parent"android:layout_height="wrap_content" /></RelativeLayout>

LinearViewAdapterActivity

package com.example.hello.recyclerView;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.hello.R;public class LinearViewAdapterActivity extends RecyclerView.Adapter<LinearViewAdapterActivity.LinearViewHolder> {private Context context;public LinearViewAdapterActivity(Context context) {this.context = context;}@NonNull@Overridepublic LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_linear_item, parent, false));}@Overridepublic void onBindViewHolder(@NonNull LinearViewHolder holder, int position) {CharSequence charSequence = "Hello World!";holder.ltv.setText(charSequence);}@Overridepublic int getItemCount() {return 30;}/*** 封装控件*/static class LinearViewHolder extends RecyclerView.ViewHolder {private TextView ltv;public LinearViewHolder(@NonNull View itemView) {super(itemView);ltv = itemView.findViewById(R.id.linear_tv);}}}

layout_linear_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/yellow_blew"android:clickable="true"android:orientation="vertical"android:padding="15dp"><TextViewandroid:id="@+id/linear_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_btn2"android:gravity="center"android:padding="5dp"android:text="@string/app_name"android:textColor="@color/black"android:textSize="20sp" /></LinearLayout>

1.2 点击事件

在这个文件内设置不方便, 想在 LinearRecyclerViewActivity 文件内设置.

LinearViewAdapterActivity 文件改变如下

package com.example.hello.recyclerView;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.hello.R;public class LinearViewAdapterActivity extends RecyclerView.Adapter<LinearViewAdapterActivity.LinearViewHolder> {private Context context;private OnItemClickListener listener;public LinearViewAdapterActivity(Context context, OnItemClickListener listener) {this.context = context;this.listener = listener;}@NonNull@Overridepublic LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_linear_item, parent, false));}@Overridepublic void onBindViewHolder(@NonNull LinearViewHolder holder, int position) {CharSequence charSequence = "Hello World!";holder.ltv.setText(charSequence);// 点击事件holder.ltv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onClick(position);}});}@Overridepublic int getItemCount() {return 30;}/*** 封装控件*/static class LinearViewHolder extends RecyclerView.ViewHolder {private TextView ltv;public LinearViewHolder(@NonNull View itemView) {super(itemView);ltv = itemView.findViewById(R.id.linear_tv);}}/*** 设置监听接口*/public interface OnItemClickListener {void onClick(int position);}}

LinearRecyclerViewActivity 文件改变如下

package com.example.hello.recyclerView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import com.example.hello.R;public class LinearRecyclerViewActivity extends AppCompatActivity {// 声明private RecyclerView rv1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_linear_recycler_view);// 获取rv1 = findViewById(R.id.rv_1);rv1.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));// 添加分割线rv1.addItemDecoration(new Decoration());rv1.setAdapter(new LinearViewAdapterActivity(LinearRecyclerViewActivity.this, new LinearViewAdapterActivity.OnItemClickListener() {@Overridepublic void onClick(int position) {Toast.makeText(LinearRecyclerViewActivity.this, position + " 进行了点击", Toast.LENGTH_SHORT).show();}}));}/*** 设置分割线*/class Decoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));}}
}

2. 水平布局

和垂直的没有什么区别

  1. 设置成水平布局
  2. 分割线改成右侧
  3. item 和其他文件相应改动
package com.example.hello.recyclerView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import com.example.hello.R;public class HorRecyclerViewActivity extends AppCompatActivity {// 声明private RecyclerView rv2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_hor_recycler_view);// 获取rv2 = findViewById(R.id.rv_2);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(HorRecyclerViewActivity.this);// 设置水平方向linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rv2.setLayoutManager(linearLayoutManager);// 添加分割线rv2.addItemDecoration(new Decoration());rv2.setAdapter(new HorViewAdapterActivity(HorRecyclerViewActivity.this, new HorViewAdapterActivity.OnItemClickListener() {@Overridepublic void onClick(int position) {Toast.makeText(HorRecyclerViewActivity.this, position + " 进行了点击", Toast.LENGTH_SHORT).show();}}));}/*** 设置分割线*/class Decoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);outRect.set(0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight), 0);}}
}

3. 网格布局

和垂直, 水平的也没有什么区别

  1. 设置成网格布局
  2. 分割线改成全部
  3. item 和其他文件相应改动
package com.example.hello.recyclerView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import com.example.hello.R;public class GridRecyclerViewActivity extends AppCompatActivity {// 声明private RecyclerView rv3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_grid_recycler_view);// 获取rv3 = findViewById(R.id.rv_3);// 每行显示三个rv3.setLayoutManager(new GridLayoutManager(GridRecyclerViewActivity.this, 3));// 添加分割线rv3.addItemDecoration(new Decoration());rv3.setAdapter(new GridViewAdapterActivity(GridRecyclerViewActivity.this, new GridViewAdapterActivity.OnItemClickListener() {@Overridepublic void onClick(int position) {Toast.makeText(GridRecyclerViewActivity.this, position + " 进行了点击", Toast.LENGTH_SHORT).show();}}));}/*** 设置分割线*/class Decoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);int height = getResources().getDimensionPixelOffset(R.dimen.dividerHeight);//noinspection SuspiciousNameCombinationoutRect.set(height, height, height, height);}}
}

4. 瀑布流

和上面的操作也没有什么区别, 为了看出不同, item 中改成了长度不同的照片.

  1. 设置成瀑布流形式
  2. item 改成照片
  3. item 和其他文件相应改动

PuRecyclerViewActivity

package com.example.hello.recyclerView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import com.example.hello.R;public class PuRecyclerViewActivity extends AppCompatActivity {// 声明private RecyclerView rv4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pu_recycler_view);// 得到内容rv4 = findViewById(R.id.rv_4);// StaggeredGridLayoutManager.VERTICAL 代表有多少列, StaggeredGridLayoutManager.HORIZONTAL  代表有多少行rv4.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));// 添加分割线rv4.addItemDecoration(new Decoration());rv4.setAdapter(new StaggeredGridViewAdapterActivity(PuRecyclerViewActivity.this, new StaggeredGridViewAdapterActivity.OnItemClickListener() {@Overridepublic void onClick(int position) {Toast.makeText(PuRecyclerViewActivity.this, position + " 进行了点击", Toast.LENGTH_SHORT).show();}}));}/*** 设置分割线*/class Decoration extends RecyclerView.ItemDecoration {@Overridepublic void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);int height = getResources().getDimensionPixelOffset(R.dimen.dividerHeight);//noinspection SuspiciousNameCombinationoutRect.set(height, height, height, height);}}
}

StaggeredGridViewAdapterActivity

package com.example.hello.recyclerView;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.hello.R;public class StaggeredGridViewAdapterActivity extends RecyclerView.Adapter<StaggeredGridViewAdapterActivity.LinearViewHolder> {private Context context;private OnItemClickListener listener;public StaggeredGridViewAdapterActivity(Context context, OnItemClickListener listener) {this.context = context;this.listener = listener;}@NonNull@Overridepublic LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_staggered_grid_item, parent, false));}@Overridepublic void onBindViewHolder(@NonNull LinearViewHolder holder, int position) {// 两列显示不同的内容int imageResource = position % 2 != 0 ? R.mipmap.beautiful : R.mipmap.long_up;holder.iv.setImageResource(imageResource);// 点击事件holder.iv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onClick(position);}});}@Overridepublic int getItemCount() {return 30;}/*** 封装控件*/static class LinearViewHolder extends RecyclerView.ViewHolder {private ImageView iv;public LinearViewHolder(@NonNull View itemView) {super(itemView);iv = itemView.findViewById(R.id.staggered_grid_iv);}}/*** 设置监听接口*/public interface OnItemClickListener {void onClick(int position);}}

layout_staggered_grid_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/yellow_blew"android:clickable="true"android:orientation="horizontal"android:padding="15dp"><ImageViewandroid:id="@+id/staggered_grid_iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/beautiful"android:scaleType="centerCrop"android:src="@mipmap/beautiful" /></LinearLayout>

5. 样式

不同的 ViewHolder.
XRecyclerView: addHeadView, addFootView, 下拉刷新, 上拉加载.

水平布局布局为例子. 将其改成一个是汉字一个是照片.

新建 layout_linear_item2.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/yellow_blew"android:clickable="true"android:orientation="vertical"android:padding="15dp"><TextViewandroid:id="@+id/linear_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_btn3"android:gravity="center"android:padding="5dp"android:text="@string/app_name"android:textColor="@color/black"android:textSize="20sp" /><ImageViewandroid:id="@+id/linear_iv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="10dp"android:contentDescription="@string/app_name"android:scaleType="fitCenter"android:src="@mipmap/ic_launcher_round" /></LinearLayout>

LinearViewAdapterActivity

package com.example.hello.recyclerView;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.hello.R;public class LinearViewAdapterActivity extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private OnItemClickListener listener;public LinearViewAdapterActivity(Context context, OnItemClickListener listener) {this.context = context;this.listener = listener;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {if (viewType == 0) {return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_linear_item, parent, false));} else {return new LinearViewHolder2(LayoutInflater.from(context).inflate(R.layout.layout_linear_item2, parent, false));}}@Overridepublic int getItemViewType(int position) {return position % 2 == 0 ? 0 : 1;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if (getItemViewType(position) == 0) {CharSequence charSequence = "Hello World!";((LinearViewHolder) holder).ltv.setText(charSequence);// 点击事件((LinearViewHolder) holder).ltv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onClick(position);}});} else {CharSequence charSequence = "Nice to meet you!";((LinearViewHolder2) holder).ltv.setText(charSequence);// 点击事件((LinearViewHolder2) holder).ltv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onClick(position);}});((LinearViewHolder2) holder).liv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onClick(position);}});}}@Overridepublic int getItemCount() {return 30;}/*** 封装控件*/static class LinearViewHolder extends RecyclerView.ViewHolder {private TextView ltv;public LinearViewHolder(@NonNull View itemView) {super(itemView);ltv = itemView.findViewById(R.id.linear_tv);}}/*** 封装控件*/static class LinearViewHolder2 extends RecyclerView.ViewHolder {private TextView ltv;private ImageView liv;public LinearViewHolder2(@NonNull View itemView) {super(itemView);ltv = itemView.findViewById(R.id.linear_tv);liv = itemView.findViewById(R.id.linear_iv);}}/*** 设置监听接口*/public interface OnItemClickListener {void onClick(int position);}}

Android 中 RecyclerView 的基本使用相关推荐

  1. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  2. Android中RecyclerView点击item展开列表详细内容(超简单实现)

    请注明出处: http://blog.csdn.net/qq_23179075/article/details/79230457 Android中RecyclerView点击item展开列表详细内容( ...

  3. android 中RecyclerView 嵌套了 GridView 的用法

    提醒一下 RecyclerView 安卓自带的当中是没有的,所以需要导入包的. android.support.v4.widget.SwipeRefreshLayout 中的v7,v4都已经变成 an ...

  4. Android中RecyclerView的长按

    案例:点击跳转页面,长按弹窗,点击删除. [完整代码在这里] 首先,写好点击事件的接口类 //自定义点击接口类public interface OnItemClickLitener {//点击事件vo ...

  5. android中RecyclerView的使用

    1. RecyclerView概述 Android提供了一个更强大的滚动控件--RecyclerView. 它可以说是一个增强版的ListView, 不仅可以轻松实现和ListView同样的效果, 还 ...

  6. Android中 RecyclerView的回收复用机制

    作者:金大人的梦 转载地址:https://juejin.cn/post/7094497660983312397 问题归类: 什么是回收?什么是复用? 回收什么?复用什么? 回收到哪里去?从哪里获得复 ...

  7. Android中设置RecyclerView的每一个item的单项点击事件

    场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  8. android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView.闲话休提,言归正转.让我们一起Talk Androi ...

  9. Android中当item数量超过一定大小RecyclerView高度固定

    Android中当item数量超过一定大小时,将RecyclerView高度固定 方法1 直接通过LayoutParams来设定相应高度 ViewGroup.LayoutParams lp = rv. ...

  10. android自定义起止时间的时间刻度尺,Android中自定义RecyclerView如何实现不固定刻度的刻度尺...

    Android中自定义RecyclerView如何实现不固定刻度的刻度尺 发布时间:2020-07-17 16:50:28 来源:亿速云 阅读:116 作者:小猪 这篇文章主要讲解了Android中自 ...

最新文章

  1. 【高精度】被限制的加法
  2. Java中有关Null的9件事
  3. 第一次冲刺对各组的评价
  4. 介绍几个移动web app开发框架
  5. C++实现tree234树(附完整源码)
  6. (三)Boost库之字符串处理
  7. 常见的linux命令及其翻译
  8. FirefoxOS 1.2 on ZTE Open
  9. centos8.2安装ovirt
  10. mf4350d驱动下载linux,佳能 imageCLASS MF4350d 驱动程序下载-更新佳能软件(打印机)
  11. The essense of the software atchitecture
  12. 【华为云】python调用华为云API,获取token值
  13. Ubuntu18中添加中文输入法
  14. MXNet网络模型(四)GAN神经网络
  15. 传统企业互联网转型升级
  16. linux usb有线网卡驱动_有线网卡Linux驱动安装小记
  17. 运行kaldi中遇到的问题总结
  18. FX1S控制步进电机的实例(图与程序)
  19. Spring Cloud Alibaba系列使用(二)----Nacos注册中心
  20. scratch绘制花瓣 少儿编程电子学会图形化编程scratch等级考试四级真题和答案解析2021-3

热门文章

  1. 提示 使用驱动器D:中的光盘之前需要将其格式化
  2. 十大管理47个过程说明:含义,输入,输出,工具,解释
  3. 笔记本电脑刚回来没有计算机,刚买笔记本电脑我的笔记本电脑没有光驱,如果重新安装系统,怎么样操 爱问知识人...
  4. adb shell 小米手机_Ubuntu下adb连接小米手机
  5. 购买namesilo域名可以用微信支付了
  6. 转正述职报告怎么写?五年经验PM告诉你……
  7. 神经网络过拟合解决方法,神经网络过拟合现象
  8. 普通二极管伏安特性和肖特基二极管电压电流特性
  9. 用cdr怎么精确裁剪图形
  10. Visio 2013—安装步骤说明