Android 列表或网格形式展示大量数据:RecyclerView

目录

  1. RecyclerView是什么
  2. 如何使用
  3. RecyclerView 涉及到的类
  4. LayoutManager
  5. 为Item设置不同的布局样式
  6. 制作拖动的RecyclerView

一、RecyclerView是什么

RecyclerView是Android支持库中的一个控件,用于在列表或网格形式展示大量数据。它是ListView的升级版,提供了更灵活、可定制化的方式来展示和管理数据。

二、如何使用

RecyclerView的使用步骤:

  1. 创建RecyclerView控件对象
  2. 设置适配器 : 一般是使用自定义的适配器 , 设置给 RecyclerView 对象 ;
  3. 创建适配器的布局文件
  4. 创建并设置布局管理器 : 可以使用预置的布局管理器 , 也可以自定义布局管理器 ;

(1)创建控件

<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/home_rv_product"android:layout_width="1500dp"android:layout_height="800dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>

(2)创建适配器

class HomeProductAdapter(var productList:ArrayList<HomeProductBean>): RecyclerView.Adapter<HomeProductAdapter.MyViewHolder>() {inner class MyViewHolder(view: View): RecyclerView.ViewHolder(view){}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.home_item_home_product,parent,false)return MyViewHolder(view)}override fun getItemCount(): Int {return productList.size}override fun onBindViewHolder(holder: MyViewHolder, position: Int) {}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="200dp"android:layout_height="270dp"android:layout_marginRight="20dp"android:layout_marginBottom="20dp"android:background="@drawable/dingdian_imge_price_bg"><ImageViewandroid:id="@+id/iv_sugar"android:layout_width="150dp"android:layout_height="150dp"android:layout_centerHorizontal="true"android:layout_marginTop="28dp"android:src="@drawable/icon_coin"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_name1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:text="蓝色棉花"android:textColor="#fa7698"android:textSize="22sp"android:textStyle="bold"android:layout_marginTop="10dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/iv_sugar" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"android:gravity="center"android:layout_marginTop="10dp"app:layout_constraintTop_toBottomOf="@+id/tv_name1"><ImageViewandroid:id="@+id/home_imageview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="5dp"android:src="@drawable/icon_coin" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:text="0.0"android:textColor="#fa7698"android:textSize="30sp"android:textStyle="bold"/></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

(3)进行使用

class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>() {private val productList  = ArrayList<HomeProductBean>()private var homeProductAdapter:HomeProductAdapter? = nulloverride fun HomeFragmentHomeBinding.initView() {//设置布局排列方式,默认垂直排列val gridLayoutManager: GridLayoutManager =GridLayoutManager(this@HomeFragment.context, 6, GridLayoutManager.VERTICAL, false)homeRvProduct.layoutManager = gridLayoutManager//设置adapterproductList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))productList.add(HomeProductBean(1,"asdf"))....homeProductAdapter = HomeProductAdapter(productList)homeRvProduct.adapter = homeProductAdaptertvTime.setOnLongClickListener {val findNavController = findNavController()findNavController.navigate(R.id.home_action_home_homefragment_to_home_userloginfragment)return@setOnLongClickListener true}}}

运行结果:
在这里插入图片描述

三、RecyclerView 涉及到的类

  1. RecyclerView:是RecyclerView控件的核心类,用于展示和管理数据。它负责协调LayoutManager、Adapter和ItemAnimator之间的交互,并处理用户交互事件。

  2. RecyclerView.Adapter:是RecyclerView的适配器类,负责将数据绑定到RecyclerView上。开发者需要继承该类并实现必要的方法,如创建ViewHolder、绑定数据等。

  3. RecyclerView.ViewHolder:是RecyclerView中每个列表项或网格项的持有者类。它包含了对应项的视图以及与之相关的操作。通过重写Adapter的 onCreateViewHolder() 方法来创建ViewHolder。RecyclerView.Adapter 适配器 的 onBindViewHolder 方法中为其关联数据 ;

  4. RecyclerView.LayoutManager:是RecyclerView的布局管理器类,负责决定子项的排列方式。Android提了一些默认的LayoutManager,如LinearLayoutManager(线性布局)、GridLayoutManager(网格布局)和StaggeredGridLayoutManager(瀑布流布局),也可以自定义LayoutManager。

  5. RecyclerView.ItemDecoration:是RecyclerView的装饰器类,用于为列表项添加分割线或其他样式。开发者可以继承该类并实现相应的方法,然后通过RecyclerView的addItemDecoration方法添加装饰器。
    【binding.rvX.addItemDecoration(new CustomDecoration(mContext, LinearLayoutManager.VERTICAL, 2));】这句代码的作用是在RecyclerView中添加一个自定义的装饰器,用于给列表项之间添加分割线,并指定分割线的宽度和方向。

  6. RecyclerView.ItemAnimator:是RecyclerView的动画类,用于在插入、删除和移动列表项时添加过渡动画效果。Android提供了一些默认的ItemAnimator,如DefaultItemAnimator和SimpleItemAnimator,也可以自定义ItemAnimator。

四、LayoutManager

4.1 线性布局 LinearLayoutManager

使用代码创建 线性布局管理器 LinearLayoutManager

LinearLayoutManager(Context context, @RecyclerView.Orientation int orientation, boolean reverseLayout)

context:表示上下文对象,通常是Activity或Fragment的引用。
orientation:表示布局的方向,可以是RecyclerView.HORIZONTAL(水平方向)或RecyclerView.VERTICAL(垂直方向)。
reverseLayout:表示是否将布局进行反转。如果设置为true,则列表项会从尾部开始排列;如果设置为false,则列表项会从头部开始排列。

reverseLayout这个参数在某些情况下很有用,比如当需要实现类似聊天界面的消息列表时,可以将reverseLayout设置为true,使得新的消息始终显示在列表的底部。

LinearLayoutManager layoutManagerFirst = new LinearLayoutManager(mContext,RecyclerView.HORIZONTAL,true);advancedNewBinding.rvAdvancedFirst.setLayoutManager(layoutManagerFirst);

4.2 GridLayoutManager

使用代码创建 线性布局管理器 GridLayoutManager

GridLayoutManager (Context context, int spanCount, @RecyclerView.Orientation int orientation, boolean reverseLayout)

参数同LinearLayoutManager一样。

int spanCount : 网格布局行或列的个数.

 GridLayoutManager layoutManager = new GridLayoutManager(mContext, 8, GridLayoutManager.HORIZONTAL, false);advancedBinding.rvPara.setLayoutManager(layoutManager);

五、为Item设置不同的布局样式

比如,有的item需要的是:
布局一:文本+输入框+按钮
布局二:按钮
在这里插入图片描述

 @Overridepublic int getItemViewType(int position) {//这里为不同位置的组件设置不同的布局类型 ;if (position > 27) return TYPE_OTHER;return TYPE_NORMAL;}
 @Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View inflate;//根据布局类型加载不同的布局文件if (viewType == TYPE_NORMAL) {inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_parameter_new, viewGroup, false);return new ViewHolder(inflate);} else {inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_manual_advanced, viewGroup, false);return new ViewHolderOther(inflate);}}

六、制作拖动的RecyclerView

比如我们想通过拖动item来调整位置,应该如何操作呢?
ItemTouchHelper 可以为 RecyclerView 添加拖动效果 ;

ItemTouchHelper 需要与 RecyclerView 和 ItemTouchHelper.Callback 结合起来使用 ;

 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {//线性布局和网格布局都可以使用@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFrlg = 0;if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {dragFrlg = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;} else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {dragFrlg = ItemTouchHelper.UP | ItemTouchHelper.DOWN;}return makeMovementFlags(dragFrlg, 0);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {//滑动事件  下面注释的代码,滑动后数据和条目错乱,被舍弃
//            Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
//            ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());//得到当拖拽的viewHolder的Positionint fromPosition = viewHolder.getAdapterPosition();//拿到当前拖拽到的item的viewHolderint toPosition = target.getAdapterPosition();if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(showAdapter.getGoodsBeans(), i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(showAdapter.getGoodsBeans(), i, i - 1);}}showAdapter.notifyItemMoved(fromPosition, toPosition);return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {//侧滑删除可以使用;}@Overridepublic boolean isLongPressDragEnabled() {//启用长按拖动功能return true;}/*** 长按选中Item的时候开始调用* 长按高亮** @param viewHolder* @param actionState*/@SuppressLint("MissingPermission")@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {super.onSelectedChanged(viewHolder, actionState);if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {viewHolder.itemView.setScaleX(1.1f);viewHolder.itemView.setScaleY(1.1f);}}/*** 手指松开的时候还原高亮** @param recyclerView* @param viewHolder*/@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);viewHolder.itemView.setBackgroundColor(0);showAdapter.notifyDataSetChanged();  //完成拖动后刷新适配器,这样拖动后删除就不会错乱}});//为rv设置helperhelper.attachToRecyclerView(binding.rvShow);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》18.1 图表类型与设计

第18章&#xff1a;创建图表和数据可视化 18.1 图表类型与设计 Excel提供了多种图表类型&#xff0c;帮助用户以直观的方式展示数据。选择合适的图表类型和设计可以显著提高数据的可读性和理解度。以下将介绍常见的图表类型及其应用&#xff0c;并通过具体案例进行说明。 18.…

如何利用Jenkins自动化管理、部署数百个应用

目录 1. Jenkins 安装与部署步骤 1.1 系统要求 1.2 安装步骤 1.2.1 Windows 系统 1.2.2 CentOS 系统 1.3 初次配置 2. Gradle 详细配置方式 2.1 安装 Gradle 2.1.1 Windows 系统 2.1.2 CentOS 系统 2.2 配置 Jenkins 中的 Gradle 3. JDK 详细配置方式 3.1 安装 JD…

Java:防止输入输出超时

一、防止输入超时 当我们直接使用Scanner进行输入操作的时候&#xff0c;每次读取输入的数据都会进行一次硬盘的IO操作&#xff0c;这个操作是很慢的&#xff0c;如果要读取的数据过多&#xff0c;那么我们在刷题网站上就很有可能因为多次的数据读取操作产生超时&#xff01;那…

渠道查问卷调查个人怎么做?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲渠道查问卷调查个人怎么做&#xff1f; 对海外问卷项目有过一些了解的人呢&#xff0c;都应该知道一些渠道查的优势&#xff0c;首先是省去了注册账号、养号一系列的繁琐操作&#xff0c;那通过测题、做题&#xff0c;然…

vscode调试nextjs前端后端程序、nextjs api接口

最近有一个项目使用了nextjs框架&#xff0c;并且使用nextjs同时实现了前后端&#xff0c;由于之前前后端都是分离的&#xff0c;前端的调试可以通过在代码种添加debugger或者直接在浏览器中打断点实现&#xff0c;现在想调试后端接口&#xff0c;前面的方式就不适用了。故研究…

CMA软件实验室评审如何做好人员技术能力的评价?

人员作为实验室的一个重要质量因素&#xff0c;其技术能力和素质水平体现了实验室水平的高低。人员能力是随着时间动态变化的&#xff0c;有效地评价实验室人员的技术能力&#xff0c;是保证实验室活动的必要条件。CMA软件实验室评审也要求实验室要注意对人员能力的监督&#x…

基于web的物流配送管理系统/基于客户时间窗变化的物流配送管理系统/快递配送管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

性能测试工具、负载测试工具、缺陷跟踪工具推荐

负载测试工具 - 有助于对站点或应用程序进行性能/负载测试 1&#xff09;WebLOAD WebLOAD 是一款出色的测试工具&#xff0c;提供了许多强大的脚本功能&#xff0c;有助于测试复杂场景。该工具支持从 Selenium 到移动端、从企业应用到网络协议的数百种技术。使用这款工具可以…

JAVA.包、final、权限

包 final 权限 代码块 1.构造代码块 创建这个本类的对象的时候会先指向构造代码块再执行构造方法 作用&#xff1a;把构造方法重复的部分抽取出来 2.静态代码块 static 随着类的加载而加载&#xff0c;只执行一次。 作用&#xff1a;数据初始化&#xff0c;比如在学生管…

CSS学习笔记[Web开发]

CSS学习 本文为学习笔记&#xff0c;参考菜鸟和w3c 文章目录 CSS 简介CSS 插入外部 CSS内部 CSS行内 CSS多个样式表层叠顺序 CSS 语法例子解释 CSS 选择器CSS 元素选择器CSS id 选择器实例CSS 类选择器实例CSS 通用选择器实例CSS 分组选择器CSS 后代选择器CSS 子元素选择器CSS …

OnlyOffice社区版部署及前端嵌入使用实现office的docx、xlsx等在线协同编辑预览

一、OnlyOffice介绍 ONLYOFFICE 是一款功能丰富的在线办公软件。它由 Ascensio System SIA 公司开发&#xff0c;有社区版、企业版和开发版等版本。本教程介绍开源社区版的安装使用&#xff0c;实现查看、编辑并协作处理文档、工作表、幻灯片&#xff0c;多人实时协同编辑&…

「树形结构」基于 Antd 实现一个动态增加子节点+可拖拽的树

效果 如图所示 实现 import { createRoot } from react-dom/client; import React, { useState } from react; import { Tree, Input, Button } from antd; import { PlusOutlined } from ant-design/icons;const { TreeNode } Tree; const { Search } Input;const ini…

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…

C# 基础语法(一篇包学会的)

C#&#xff08;读作"C Sharp"&#xff09;是一种现代的、通用的面向对象编程语言&#xff0c;由微软公司开发。它结合了C和C的强大特性&#xff0c;并去掉了一些复杂性&#xff0c;使得开发者可以更加高效地编写代码。 一、入坑C# (一) 安装和设置 首先&#xff0c…

Vue 实现电子签名并生成签名图片

目录 前言项目结构代码实现 安装依赖创建签名画布组件生成签名图片 总结相关阅读 1. 前言 电子签名在现代Web应用中越来越普遍&#xff0c;例如合同签署、确认表单等。本文将介绍如何使用Vue.js实现一个简单的电子签名功能&#xff0c;并将签名生成图片。 2. 项目结构 项…

外行对自动驾驶汽车的一些想法-2024-

起源 前段时间有关于自动驾驶汽车的讨论&#xff0c;现在热度终于快过去了。 (⊙﹏⊙) 其实&#xff0c;完全不用担心自动驾驶取代人类。 引用 这是一篇24年4月的报道。 上图为引用&#xff0c;可以看到打工人的忙碌。 2023 一个热爱自动驾驶但妥妥外行之人的思考-2023-C…

【进程检测】使用pywin32捕获window进程信息

需求 检测win系统依赖服务进程的运行情况&#xff0c;版本信息&#xff08;进程检测器&#xff09;检测内外网连接情况 实现 进程检测 # 使用pywin32获取进程版本信息 def get_version_info(path):try:info GetFileVersionInfo(path, \\)ms info[FileVersionMS]ls info[…

C/C++樱花树代码

目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树&#xff0c;只需这100行代码&#xff01; 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…

MySQL的高可用(MHA)

高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要三台。 故障切换过程0-30秒 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先级确定的&#xff0c;主从复制的时候就确定…

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…