展开说说: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.RecyclerViewandroid: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() {@Overridepublic void onClick(View view) {mItemClickListener.onItemClick(position);selectPosition = position;}});}

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

 changeTV.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);Log.e(TAG, "onScrollStateChanged: newState= "+newState );}@Overridepublic 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() {

可执行页面刷新操作

    }
});

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

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

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

相关文章

【Android】Material TabLayout使用详解

基本用法 TabItem可以设置text&#xff0c;icon&#xff0c;layout三个属性 其它属性都通过TabLayout来统一设置 <com.google.android.material.tabs.TabLayout><com.google.android.material.tabs.TabItem/><com.google.android.material.tabs.TabItem/>…

VCS编译bug汇总

‘typedef’ is not expected to be used in this contex 注册前少了分号。 Scope resolution error resolution : 声明指针时 不能与类名同名&#xff0c;即 不能声明为adapter. cannot find member "type_id" 忘记注册了 拼接运算符使用 关键要加上1b&#xff0…

[MySQL]购物管理系统—简略版

本文内容需以MySQL支持 特别感谢baidu comate AI提供的少量虚拟数据 0.建库(建立数据库——utf8字符集&#xff0c;utf8_general_ci排序规则) 1.此项目ER图如下 2.DDLDML(共九表&#xff0c;27数据) SET FOREIGN_KEY_CHECKS 0;DROP TABLE IF EXISTS goods; CREATE TABLE g…

前端vue-cli相关知识与搭建过程(项目创建,组件路由)very 详细

一.关于vue-cli 1.什么是vue Vue (读音 /vju ː /&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 Vue.js 是前端的主流框架之一&#xff0c;和 Angular.js…

【公开数据集获取】

Open Images Dataset https://www.youtube.com/watch?vdLSFX6Jq-F0

一分钟彻底掌握java泛型

Java中的泛型&#xff08;Generics&#xff09; 在Java中&#xff0c;泛型是JDK 5引入的一个非常重要的特性&#xff0c;它允许你在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。使用泛型的主要好处是可以提供编译时的类型检查&#xff0c;减少…

【M365运维】Outlook和Teams里不显示用户的组织架构

【问题】 由于一些误操作&#xff0c;把用户账户禁用并重新启用后&#xff0c;发现在Outlook和Teams里无法查看用户的组织结构图了。如下图所示&#xff1a; - 在Outlook 里&#xff0c;用户标签页的组织一直显示“正在加载..."&#xff0c;成员身份也是“找不到任何组。…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC&#xff0c;其实我个人是觉得软件IIC比较方便的&#xff0c;不过之前文章里用的都是软件IIC&#xff0c;今天就算是走出自己的舒适圈&#xff0c;我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407&#xff0c;不同型号的…

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…

策略模式和状态模式

策略模式 在上下文中携带策略接口作为成员变量&#xff0c;在使用上下文之前需要设置策略setStrategy&#xff08;&#xff09;&#xff0c;然后使用策略接口成员变量来进行策略的执行。 步骤1&#xff1a;定义策略接口 // 策略接口 public interface Strategy {int execut…

猎豹WiFi

猎豹WiFi&#xff0c;记得刚安装完就一堆广告弹窗&#xff0c;然后删除了一些东西&#xff0c;不影响开热点的功能。 kwifi.zip - 蓝奏云

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了

真正要战胜的,不是困难,是自己

记录一些好的文字&#xff0c;希望可以和大家共勉。 一个人真正的成长&#xff0c;是战胜自己 不知你是否有这样的经历&#xff1a;曾经觉得一道题很难&#xff0c;但解出来后&#xff0c;发现其实并没那么难&#xff1b;曾经觉得一件事是不可能完成的&#xff0c;但历经千辛万…

vitest-前端单元测试

Vitest是一个轻量级、快速且功能强大的测试框架&#xff0c;特别适用于Vite项目&#xff0c;但也可以与其他前端项目&#xff08;如使用webpack构建的项目&#xff09;集成使用。Vitest提供极速的测试体验&#xff0c;并包含一系列用于编写和组织测试用例的API&#xff0c;如de…

vue项目中,pnpm不能用-解决

方法四&#xff1a;解决 PowerShell 执行策略问题 如果你决定继续使用 PowerShell&#xff0c;并且遇到执行策略问题&#xff0c;可以尝试以下方法解决&#xff1a; 永久更改执行策略&#xff1a; 在管理员权限的 PowerShell 中运行以下命令&#xff0c;以永久更改执行策略&am…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下Hive中常见的优化手段----数据采集&#xff01;常见的Join 优化有哪几种&#xff01;什么是Hive索引&#xff01;数据怎么发生倾斜&#xff01;什么是mapreduce的本…

力扣每日一题 6/24 模拟 数组 单调栈

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 503.下一个更大元素II 【中等】 题目&#xff1a; 给定一个循环数组 nums…

数据分析师怎么去快速读一本书

背景&#xff1a;优秀的数据分析师怎么去快速读一本书 一本好书的判断依据 1.有没有再次印刷&#xff0c;三次印刷一般是好书 2.作者 快读选书顺序 1.目录->定位这是一本什么书 2.看内容的呈现形式&#xff0c;内容的各部分占比大概是什么类型的信息。 3.去看自己擅长的知…

使用原子子表创建可重用的子组件

原子子表是一个图形对象&#xff0c;可帮助您在Stateflow图表中创建独立的子部件。原子子表允许&#xff1a; 对具有多个状态或层次结构的图表进行微小更改后&#xff0c;模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发&#xff0c;适用于在同一图…

在现代多核和多线程环境中,如何优化 C 语言程序以充分利用硬件并行性?

在现代多核和多线程环境中&#xff0c;要优化C语言程序以充分利用硬件并行性&#xff0c;可以考虑以下几点&#xff1a; 并行算法设计&#xff1a;将任务分解为多个独立的子任务&#xff0c;并使用多线程或多进程同时执行这些子任务。这可以通过将问题分解为多个部分&#xff0…