【RecyclerView】 十二、RecyclerView 数据更新 ( 修改单条数据 | 批量修改数据 )
文章目录
- 一、修改单条数据
- 二、批量修改数据
- 三、完整代码示例
- 四、RecyclerView 相关资料
一、修改单条数据
修改单条数据 : 调用 RecyclerView.Adapter 的 void notifyItemChanged(int position) 方法 , 传入的参数是被删除元素的索引 ( 删除之前的索引值 ) ;
该方法的作用是通知任何被注册的观察者 , position 位置的 item 元素对应的数据被修改了 ;
该方法等价于 notifyItemChanged(position, null) ;
int position 参数 : 发生改变的 item 元素位置 ;
注意 : 调用该方法后 , 只会刷新与该位置相关的 item 元素 , 不会刷新其它元素 , 即使数据改变了 , 也不会刷新 ; 也就是说 RecyclerView 只刷新涉及到的 position 位置的元素 , RecyclerView 中的其它 item 元素不变 ; position 位置的元素身份 id 不变 , 只是绑定的数据发生改变 ;
代码示例 : 修改第 000 个元素 ;
// 替换第 0 个元素names.set(0, "宋江江");// 通知适配器adapter.notifyItemChanged(0);
RecyclerView.Adapter.notifyItemChanged(int position) 函数原型 : 该函数定义在 RecyclerView 的内部类 Adapter 中 ;
public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {public abstract static class Adapter<VH extends ViewHolder> {/*** 通知任何被注册的观察者 , position 位置的 item 元素对应的数据被修改了 ;* 该方法等价于 notifyItemChanged(position, null) ;* * 这是一个结构性的变化事件 ; * 表示在数据集中的其它元素仍然被认为是最新的数据 , 这些数据不会被重新绑定 , * 尽管它们的位置已经发生了变化 ;* 也就是说 RecyclerView 只刷新涉及到的 positionStart ~ positionStart + itemCount 之间的这几个元素 , * 其它元素不变 ; * position 位置的元素身份不变 , 只是绑定的数据发生改变 ; * * @param position 发生改变的 item 元素位置 ** @see #notifyItemRangeChanged(int, int)*/public final void notifyItemChanged(int position) {mObservable.notifyItemRangeChanged(position, 1);}}
}
运行效果 : 动画效果是系统自带的 , 可以自己实现 ;
二、批量修改数据
批量修改数据 : 调用 RecyclerView.Adapter 的 void notifyItemRangeRemoved(int positionStart, int itemCount) 方法 , 传入的参数是被修改的元素的首个索引 , 以及插入元素的个数 ;
该方法的作用是通知任何被注册的观察者 , 从 positionStart 位置开始的的 itemCount 个 item 元素对应的数据已经被修改 ;
该方法等价于 notifyItemRangeChanged(position, itemCount, null) ;
参数说明 :
int positionStart 参数 : 被修改的元素在原数据集中首个元素的位置索引 ;
int itemCount 参数 : 数据集中被修改元素个数 ;
注意 : 这是一个结构性的变化事件 ;
表示在数据集中的其它元素仍然被认为是最新的数据 , 这些数据不会被重新绑定 , 尽管它们的位置已经发生了变化 ;
也就是说 RecyclerView 只刷新涉及到的 positionStart ~ positionStart + itemCount 之间的这几个元素 , 其它元素不变 ;
此外这些位置的元素身份不变 , 只是绑定的数据发生改变 ;
代码示例 : 修改前 333 个数据 , 通知适配器 ;
// 替换第 0, 1, 2 个元素names.set(0, "宋江江");names.set(1, "卢俊俊");names.set(2, "吴用用");// 通知适配器adapter.notifyItemRangeChanged(0, 3);
RecyclerView.Adapter.notifyItemInserted(int position) 函数原型 : 该函数定义在 RecyclerView 的内部类 Adapter 中 ;
public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {public abstract static class Adapter<VH extends ViewHolder> {/*** 通知任何被注册的观察者 , 从 positionStart 位置开始的的 itemCount 个 item 元素对应的数据已经被修改 ;* 该方法等价于 notifyItemRangeChanged(position, itemCount, null) ;* * 这是一个结构性的变化事件 ; * 表示在数据集中的其它元素仍然被认为是最新的数据 , 这些数据不会被重新绑定 , * 尽管它们的位置已经发生了变化 ;* 也就是说 RecyclerView 只刷新涉及到的 positionStart ~ positionStart + itemCount 之间的这几个元素 , * 其它元素不变 ; * 此外这些位置的元素身份不变 , 只是绑定的数据发生改变 ; * * @param positionStart 被修改的元素在原数据集中首个元素的位置索引 ;* @param itemCount 数据集中被修改元素个数 ;** @see #notifyItemChanged(int)*/public final void notifyItemRangeChanged(int positionStart, int itemCount) {mObservable.notifyItemRangeChanged(positionStart, itemCount);}}
}
运行效果 : 动画效果是系统自带的 , 可以自己实现 ;
三、完整代码示例
完整代码示例 仅做参考 :
package kim.hsl.recyclerview;import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {/*** 数据源*/private ArrayList<String> names = new ArrayList<String>();/*** 适配器*/private Adapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();//1 . 从布局中获取 RecyclerViewRecyclerView recycler_view = findViewById(R.id.recycler_view);//2 . 创建并设置布局管理器//创建布局管理器StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,RecyclerView.VERTICAL);//设置布局管理器recycler_view.setLayoutManager(layoutManager);// 设置边距recycler_view.addItemDecoration(new ItemDecoration());//3 . 创建并设置列表适配器adapter = new Adapter();recycler_view.setAdapter(adapter);// 初始化点击事件initClick();}/*** 初始化数据*/private void initData(){names.add("宋江");names.add("卢俊义");names.add("吴用");names.add("公孙胜");names.add("关胜");names.add("林冲");names.add("秦明");names.add("呼延灼");names.add("花荣");names.add("柴进");names.add("李应");names.add("朱仝");names.add("鲁智深");names.add("武松");names.add("董平");names.add("张清");names.add("杨志");names.add("徐宁");names.add("索超");}void initClick(){// 增加单个数据findViewById(R.id.insert_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在集合开始添加一个元素names.add(0, "戴宗");// 通知适配器新元素添加adapter.notifyItemInserted(0);}});// 增加多个数据findViewById(R.id.insert_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在集合开始添加多个元素names.add(0, "戴宗");names.add(0, "刘唐");names.add(0, "李逵");// 通知适配器多个新元素添加adapter.notifyItemRangeInserted(0, 3);}});// 删除单个数据findViewById(R.id.delete_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 删除第 0 个元素names.remove(0);// 通知适配器adapter.notifyItemRemoved(0);}});// 删除多个数据findViewById(R.id.delete_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 删除第 0 ~ 2 个元素names.remove(0);names.remove(0);names.remove(0);// 通知适配器adapter.notifyItemRangeRemoved(0, 3);}});// 修改单个数据findViewById(R.id.modify_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 替换第 0 个元素names.set(0, "宋江江");// 通知适配器adapter.notifyItemChanged(0);}});// 修改多个数据findViewById(R.id.modify_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 替换第 0, 1, 2 个元素names.set(0, "宋江江");names.set(1, "卢俊俊");names.set(2, "吴用用");// 通知适配器adapter.notifyItemRangeChanged(0, 3);}});// 移动数据findViewById(R.id.move_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 先移除第 0 个names.remove(0);// 然后在第 7 个位置插入, 此时变为第 7 个元素names.add(7, "宋江");// 通知适配器adapter.notifyItemMoved(0, 7);}});}/*** RecyclerView 适配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + names.get(position));}@Overridepublic int getItemCount() {return names.size();}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}
四、RecyclerView 相关资料
官方文档 :
使用 RecyclerView 创建动态列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview
高级 RecyclerView 自定义 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom
RecyclerView 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView
RecyclerView.Adapter 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.Adapter
RecyclerView.ViewHolder 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder
RecyclerView.ItemDecoration 官方文档 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration
代码示例 :
GitHub 源码地址 : https://github.com/han1202012/001_RecyclerView
博客源码快照 : https://download.csdn.net/download/han1202012/14984775
( 使用 Android Studio 打开 )
【RecyclerView】 十二、RecyclerView 数据更新 ( 修改单条数据 | 批量修改数据 )相关推荐
- 【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
文章目录 一.删除单条数据 二.批量删除数据 三.完整代码示例 四.RecyclerView 相关资料 一.删除单条数据 删除单条数据 : 调用 RecyclerView.Adapter 的 void ...
- BP客户主数据信用数据批量修改
S4 HANA中BP客户主数据信用数据批量修改 修改的关键性代码: LOOP AT gt_upload INTO gs_upload. *------------------------------- ...
- 如何批量修改文件名?批量修改照片文件名和添加前缀
通常我们使用手机或者相机拍摄了一堆照片拷贝到电脑之后,照片的命名通常都是随机混乱的,如果要规范文件命名,你是不是会去一个一个去修改文件名呢?其实完全不需要这么麻烦,今天电脑百事小编就来教大家一个批量快 ...
- 【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )
文章目录 一.增加单条数据 二.增加多条数据 三.完整代码示例 四.RecyclerView 相关资料 一.增加单条数据 增加单条数据 : 调用 RecyclerView.Adapter 的 void ...
- (五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?
上回我们讲到了数据页的物理存储结构,数据页之间是组成双向链表的,数据页内部的数据行是组成单向链表的,每个数据页内根据主键做了一个页目录 然后一般来说,你没有索引的情况下,所有的数据查询,其实在物理层面 ...
- tp5批量添加数据,批量修改数据
标题 在一次项目开发中使用TP5框架开发,有个功能是向产品上传和修改.但是上传和修改是比较简单的,在上传的同时还需要实现 多个产品服务详情的添加和修改.经过一天半的研究,才完成该功能. 1.首先是多个 ...
- php 循环从数据库分页取数据批量修改数据
1 //批量修改email重复 2 public function getEmail() 3 { 4 $this->model = app::get('shop')->model('man ...
- 根据 Excel 中的数据批量修改文件的扩展名
概要:我们之前使用的 Excel 整理文件路径的方式来批量的修改文件路径中的文件名称.但是有一点没有给大家讲的是,这里不仅可以修改文件名称,还可以修改文件的扩展名,如果你需要在Excel中也可以支持修 ...
- java修改服务器文件名,批量修改文件名 java代码
批量修改文件名 java代码 [2021-02-03 13:40:55] 简介: php实现批量修改文件名称的方法:首先使用函数[rename]实现,代码为[$path = pathinfo($cu ...
最新文章
- NVIDIA TensorRT:可编程推理加速器
- jq 数组不重复_一道简单的数组遍历题,加上四个条件后感觉无从下手
- JUnit中@Test的运行顺序
- 防抖动函数(debounce)的原理
- MYSQL和JAVA(课堂笔记)
- springboot怎么替代jsp_如何在SpringBoot中使用JSP ?
- 解决MMC不能打开文件MSC文件(转)
- 蚂蚁员工持股平台管理权变更 马云持股降至34%
- 二项式定理等价变换与简单推论
- 语音识别是什么意思_语音识别的翻译_音标_读音_用法_例句_爱词霸在线词典
- Idea搭建springcloud(一)---服务注册与发现之Eureka
- 数据库系统概论第五版学习笔记
- cad导出pdf_CAD如何批量导出PDF文件?别说PDF了!GIF我都能给你导出来
- 简约商务风ppt模板推荐
- APP推广关键词的怎么选词?
- java与设计模式-观察者模式
- 使用Helm在k8s集群上部署以太坊私有链
- WAF检测率及误报测试工具Gotestwaf
- C语言 输出三角形数列 for循环
- python中向字典循环加入键值对
热门文章
- 牛腩新闻发布系统(2)使用存储过程查询表
- ubuntu通过xmange连接桌面
- enterprise portal
- .net Redis使用公共方法引用CSRedisCore
- Exception异常
- JMeter处理jdbc请求后的响应结果
- Perl中的单行凝视和多行凝视
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects...
- TCP,IP,HTTP,SOCKET区别和联系
- SQL alter 的几种用法