展开说说:Android列表之RecyclerView

RecyclerView 它是从Android5.0出现的全新列表组件,更加强大和灵活用于显示列表形式 (list) 或者网格形式 (grid) 的数据,替代ListView和GridView成为Android主流的列表组件可以说Android客户端只要有表格的地方就有RecyclerView

RecyclerView 内置 ViewHolder省去了每次 findViewById() 创建视图;当列表滑动的时候,只有少量相邻的视图会被创建。当视图滑出屏幕时,RecyclerView 会复用它并且填充新的数据。由于它是通过回收已有的结构而不是持续创建新的列表项,所以它可以有效提高应用的时间效率和空间效率。

RecyclerView 拥有三种 LayoutManager,LinearLayoutManager

它支持纵向滑动的列表和横向滑动的列表GridLayoutManager

实现网格布局的列表StaggeredGridLayoutManager

实现瀑布流布局并且支持自定义 LayoutManager;

RecyclerView 还可以定制一些动画增加趣味性

稍微繁琐的一点是RecyclerView没有直接提供点击长按事件处理方法没有提供ItemClickListener和ItemLongClickListener,因此我们可以给某个控件加点击事件然后自己通过一个接口回调放到Activity'或者Fragment中来处理事件,个人认为这样方便操作数据源。

上面提到它是在v7包,所以一定不要忘了导包哈。

RecyclerView功能强大,本篇文章先记录横竖方向的线性列表和网格布局,瀑布流使用与这两者相似请自行实验;列表滑动、点击事件更新列表以及线程切换更新等。

  1. build.gradle引用RecyclerView

使用support.V7 包的需要导包,androidx包的不用单独引用

2. xml文件声明

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerAct_recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. findViewById并使用

recycler = findViewById(R.id.recyclerAct_recycler);

  1. 设置LayoutManager
4.1竖向布局
if (linearLayoutManager == null){
    linearLayoutManager = new LinearLayoutManager(RecyclerViewActivity.this);
}
recycler.setLayoutManager(linearLayoutManager);
此处可以设置横向,默认是竖向
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
4.2网格布局
if (gridLayoutManager == null){
    gridLayoutManager = new GridLayoutManager(RecyclerViewActivity.this, 3);
}
recycler.setLayoutManager(gridLayoutManager);

瀑布流布局StaggeredGridLayoutManager可自行试验

5.定义Adapter继承RecyclerView.Adapter

通过源码可以看出Adapter是RecyclerView的一个内部类,他还是个抽象类,内部onCreateViewHolder、onBindViewHolder、getItemCount三个从抽象方法,我们实现的子类必须重写,分别是创建布局、渲染数据、数据源数量。

通过源码可以看出Adapter是RecyclerView的一个内部类,他还是个抽象类,但无抽象方法。

还定义了changeData这个方法,如果修改了数据源可以调用它来进行刷新:

public void changeData(List<String> data){
    mData.clear();
    mData.addAll(data);
    notifyDataSetChanged();
}

6. setAdapter并传递数据进行展示

adapter = new GridLayoutAdapter(this);
recycler.setAdapter(adapter);

7.点击事件处理

没有提供ItemClickListener和ItemLongClickListener,因此我们可以给某个控件加点击事件然后自己通过一个接口回调放到Activity'或者Fragment中来处理事件,我个人认为这样方便操作源数据。

定义接口:

public void setItemClickListener(OnItemClickListener itemClickListener){
    mItemClickListener = itemClickListener;
}


public interface OnItemClickListener {
    void onItemClick(int positon);
}

点击事件:

@Override
public void onBindViewHolder(@NonNull GridLayoutAdapter.ViewHolder holder, int position) {
    holder1.name.setText(mData.get(position));
    holder1.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mItemClickListener.onItemClick(position);
            selectPosition = position;
        }
    });

}

7.1​​​​​​​ 列表竖向和表格切换,仿电商App

 changeTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (adapter == null){
                    adapter = new GridLayoutAdapter(RecyclerViewActivity.this);
                }
                if ("竖向".equals(changeTV.getText().toString().trim())){
                    if (gridLayoutManager == null){
                        gridLayoutManager = new GridLayoutManager(RecyclerViewActivity.this, 3);
                    }
                    recycler.setLayoutManager(gridLayoutManager);
                    changeTV.setText("网格");
                }else {
                    if (linearLayoutManager == null){
                        linearLayoutManager = new LinearLayoutManager(RecyclerViewActivity.this);
                    }
//                    linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
                    recycler.setLayoutManager(linearLayoutManager);
                    changeTV.setText("竖向");
                }
                recycler.setAdapter(adapter);
                adapter.changeData(mDataList);
            }
        });

7.2 将列表滑到指定索引的item

recycler.smoothScrollToPosition(42);

滑动到制定索引的位置,是指的最下方漏出来哪一条。有滑动过渡的效果。所以超过item数据总和的总都会适配直接滑动最极限值(最后一条),不会报错


recycler.scrollBy(0,360);

滑动到制定宽高的位置,是指的最下方一条的位置。没有滑动过渡的效果。scrollBy相对初始位置每次移动这些距离,超过recycler的总高度或宽度都会适配直接滑动最极限值(总宽和总高),不会报错


recycler.scrollTo(0,-2260);  好坑啊

试了几个值,但都没有滑动,好坑啊,源码是个空壳打印了一行Warn级别的日志:2024-06-27 16:41:12.102 29806-29806/包名W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead,重写了父类View就是为了毁灭它吧,

addOnScrollListener可以监听recycler的滑动状态和滑动位置:

recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        Log.e(TAG, "onScrollStateChanged: newState= "+newState );
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        Log.e(TAG, "onScrolled: dx= "+dx+"    dy= "+dy );
    }
});

7.3 点击修改item背景

    //设置item背景颜色
    if (selectPosition == position){
        holder1.name.setBackgroundColor(mActivity.getResources().getColor(R.color.red));
    }else {
        holder1.name.setBackgroundColor(mActivity.getResources().getColor(R.color.white));
    }

7.4 点击删除指定item

7.4.1直接这样操作没有没问题,但是很生硬不死话

mDataList.remove(positon);
adapter.changeData(mDataList);  

7.4.2

使用API方法加一下删除动画

mDataList.remove(positon);

adapter.notifyItemRemoved(positon);

adapter.notifyChanged(positon,mDataList);

注意:notifyItemRemoved方法比较坑,调用notifyItemRemoved以后一定要再调用notifyItemRangeRemoved这个方法,并且要有设置给recycler的数据的直接变化,直白点就是getItemCount方法中标示长度的哪个数据源,修改最最源头源头的数据源二不改变这个是无效的

getItemCount方法是上面第5条提过的返回数据源数量。notifyChanged和面第5条提过changeData方法一样,不过吧notifyDataSetChanged();换成了notifyItemRangeRemoved(position,mData.size() - position);

public void notifyChanged(int position,List<String> data){
    mData.clear();
    mData.addAll(data);
    //调用notifyItemRemoved以后一定要再调用这个方法,并且要有设置给recycler的数据的直接变化,直白点就是getItemCount中标示长度的哪个数据源,修改最最源头源头的数据源二不改变这个是无效的
    notifyItemRangeRemoved(position,mData.size() - position);
}

7.5 子线程切换到主线程更新UI

因为RecyclerView继承ViewGroup,而ViewGroup继承View,所以这里直接使用了爷类View的post方法。

recycler.post(new Runnable() {
    @Override
    public void run() {

可执行页面刷新操作

    }
});

才疏学浅,如有错误,欢迎指正,多谢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无痛接入FastText算法进行文本分类(附代码)

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

未来已来,如何打造智慧养殖场?

近年来&#xff0c;国家出台了一系列扶持政策&#xff0c;以促进养殖行业高质量发展&#xff0c;推动行业转型升级。在国家政策和市场需求的双重驱动下&#xff0c;养殖行业正迎来前所未有的发展机遇。智慧养殖以其高效、智能和可持续的特点&#xff0c;正逐步取代传统养殖方式…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

涉案财物管理系统|DW-S405系统实现涉案财物科学化管理

随着社会的不断发展&#xff0c;犯罪形式日益复杂&#xff0c;涉案财物的种类和数量也不断增加。传统的涉案财物管理方式已经无法满足现代执法办案的需求。因此&#xff0c;建立一套科学、高效、规范的警用涉案财物管理系统成为公安机关亟待解决的问题。 涉案财物管理系统DW-S…

哈希表 | 哈希查找 | 哈希函数 | 数据结构 | 大话数据结构 | Java

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;毛毛张今天分享的内容&#x1f586;是数据结构中的哈希表&#xff0c;毛毛张主要是依据《大话数据结构&#x1f4d6;》的内容来进行整理&#xff0c;不…

vue的学习--day2

如有错误&#xff0c;烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具&#xff1a;node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件&#xff08;例如登录、注册等以vue结尾的都叫做组件&#xff09;在一个页面显示&#xff0c;叫单页面应用…

Linux C 程序 【02】创建线程

1.开发背景 上一个篇章&#xff0c;基于 RK3568 平台的基础上&#xff0c;运行了最简单的程序&#xff0c;然而我们使用了 Linux 系统&#xff0c;系统自带的多线程特性还是比较重要的&#xff0c;这个篇章主要描述线程的创建。 2.开发需求 设计实验&#xff1a; 创建一个线程…

极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

现阶段&#xff0c;越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与&#xff0c;早在去年9月&#xff0c;极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率&#xff0c;方便大家…

Android 通知组

一. 通知组简介 从 Android 7.0&#xff08;API 级别 24&#xff09;开始&#xff0c;您可以在一个组中显示相关通知。如下所示: 图 1. 收起&#xff08;顶部&#xff09;和展开&#xff08;底部&#xff09;的通知组。 注意 &#xff1a;如果应用发出 4 条或更多条通知且未…

大数据平台需要存算分离吗?某保险集团:以 ZBS 优化资源利用率,缩短业务用时超一半

金融机构普遍采用“存算一体”架构支撑基于 Hadoop 框架的大数据平台。而随着金融业务的多元化发展&#xff0c;不同业务对计算和存储的需求差异较大&#xff0c;由于“存算一体”架构共享存储与计算资源&#xff0c;经常会出现资源需求不均衡、资源利用率低下、难以灵活调度等…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统&#xff0c;下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

Mysql需要知道的点

目录 一、数据库的三范式是什么 二、Mysql数据库引擎有哪些 三、说说Innodb与MYISAM的区别 四、数据库的事务 五、索引是什么 六、优化手段有哪些 七、简单说一说 drop&#xff0c;delete与truncate的区别 八、什么是视图 九、什么是内连接、左外连接、右外连接&#x…

Ubuntu20.04使用Samba

目录 一、Samba介绍 Samba 的主要功能 二、启动samba 三、主机操作 四、Ubuntu与windows系统中文件互联 五、修改samba路径 一、Samba介绍 Samba 是一个开源软件套件&#xff0c;用于在 Linux 和 Unix 系统上实现 SMB&#xff08;Server Message Block&#xff09;协议…

[行业原型] Web端原型案例:康欣医疗后台管理系统

​医疗管理系统是一个业务复杂&#xff0c;功能庞大的系统&#xff0c;以下为HIS医院管理系统的常见模块&#xff0c;供大家参考。 本周为大家带来Web端原型案例&#xff1a;康欣医疗后台管理系统&#xff0c;先上原型&#xff1a; 完整文档加班主任微信号 添加班主任回复 “1…

ansible常用模块详解

一、Ansible 1.1 简介 Ansible是自动化运维工具&#xff0c;能实现跨主机对应用编排管理部署。 Ansible能批量配置、部署、管理上千台主机&#xff0c;是应用级别的跨主机编排工具。 比如以前需要切换到每个主机上执行的一或多个操作&#xff0c;使用Ansible只需在固定的一…

练习实践:ubuntu18.04安装、配置Nginx+PHP环境,两种配置方式,多站点

参考来源&#xff1a; https://help.aliyun.com/document_detail/464753.html https://www.cnblogs.com/laosan007/p/12803287.html https://blog.csdn.net/qq_55364077/article/details/132207083 【安装同版本7.2的php】 需要知道对应php和nginx的安装版本 需要安装php-fpm…

stl之string

构造函数 void test1() {string s1;//不传参cout << s1 << endl;string s2("123456");cout << s2 << endl;string s3(s2);cout << s3 << endl;string s4(s2, 1, 5);cout << s4 << endl;string s5("123456&quo…

PHP 网络通信底层原理分析

大家好&#xff0c;我是码农先森。 引言 我们日常的程序开发大多数都是以业务为主&#xff0c;很少会接触到底层逻辑。对于我们程序员来说&#xff0c;了解程序的底层运行逻辑&#xff0c;更有助于提升我们对程序的理解。我相信大多数的人&#xff0c;每天基本上都是完成业务…

丝杆支撑座:滚珠丝杆稳定运行的守护者!

丝杆支撑座是丝杆和电机之间连接的重要组成部分&#xff0c;发挥着非常重要的功能。提到丝杆支撑座和滚珠丝杆&#xff0c;很多人都会想到支撑关系&#xff0c;但丝杆支撑座作为滚珠丝杆系统中至关重要的角色&#xff0c;其作用远不止于简单的支撑。 丝杆支撑座安装过程非常简单…

第30课 绘制原理图——放置网络标签

什么是网络标签&#xff1f; 我们在很多电路图中都能看到&#xff0c;为了让图纸更加简洁&#xff0c;并不是每一根导线都要确确实实地画出来。可以在导线悬空的一端添加一个名称标签&#xff0c;接着在另一根导线的悬空一端添加上一个同名的名称标签&#xff0c;那么就可以让…