文章目录

  • 一、修改单条数据
  • 二、批量修改数据
  • 三、完整代码示例
  • 四、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 数据更新 ( 修改单条数据 | 批量修改数据 )相关推荐

  1. 【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )

    文章目录 一.删除单条数据 二.批量删除数据 三.完整代码示例 四.RecyclerView 相关资料 一.删除单条数据 删除单条数据 : 调用 RecyclerView.Adapter 的 void ...

  2. BP客户主数据信用数据批量修改

    S4 HANA中BP客户主数据信用数据批量修改 修改的关键性代码: LOOP AT gt_upload INTO gs_upload. *------------------------------- ...

  3. 如何批量修改文件名?批量修改照片文件名和添加前缀

    通常我们使用手机或者相机拍摄了一堆照片拷贝到电脑之后,照片的命名通常都是随机混乱的,如果要规范文件命名,你是不是会去一个一个去修改文件名呢?其实完全不需要这么麻烦,今天电脑百事小编就来教大家一个批量快 ...

  4. 【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )

    文章目录 一.增加单条数据 二.增加多条数据 三.完整代码示例 四.RecyclerView 相关资料 一.增加单条数据 增加单条数据 : 调用 RecyclerView.Adapter 的 void ...

  5. (五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?

    上回我们讲到了数据页的物理存储结构,数据页之间是组成双向链表的,数据页内部的数据行是组成单向链表的,每个数据页内根据主键做了一个页目录 然后一般来说,你没有索引的情况下,所有的数据查询,其实在物理层面 ...

  6. tp5批量添加数据,批量修改数据

    标题 在一次项目开发中使用TP5框架开发,有个功能是向产品上传和修改.但是上传和修改是比较简单的,在上传的同时还需要实现 多个产品服务详情的添加和修改.经过一天半的研究,才完成该功能. 1.首先是多个 ...

  7. php 循环从数据库分页取数据批量修改数据

    1 //批量修改email重复 2 public function getEmail() 3 { 4 $this->model = app::get('shop')->model('man ...

  8. 根据 Excel 中的数据批量修改文件的扩展名

    概要:我们之前使用的 Excel 整理文件路径的方式来批量的修改文件路径中的文件名称.但是有一点没有给大家讲的是,这里不仅可以修改文件名称,还可以修改文件的扩展名,如果你需要在Excel中也可以支持修 ...

  9. java修改服务器文件名,批量修改文件名 java代码

    批量修改文件名 java代码 [2021-02-03 13:40:55]  简介: php实现批量修改文件名称的方法:首先使用函数[rename]实现,代码为[$path = pathinfo($cu ...

最新文章

  1. NVIDIA TensorRT:可编程推理加速器
  2. jq 数组不重复_一道简单的数组遍历题,加上四个条件后感觉无从下手
  3. JUnit中@Test的运行顺序
  4. 防抖动函数(debounce)的原理
  5. MYSQL和JAVA(课堂笔记)
  6. springboot怎么替代jsp_如何在SpringBoot中使用JSP ?
  7. 解决MMC不能打开文件MSC文件(转)
  8. 蚂蚁员工持股平台管理权变更 马云持股降至34%
  9. 二项式定理等价变换与简单推论
  10. 语音识别是什么意思_语音识别的翻译_音标_读音_用法_例句_爱词霸在线词典
  11. Idea搭建springcloud(一)---服务注册与发现之Eureka
  12. 数据库系统概论第五版学习笔记
  13. cad导出pdf_CAD如何批量导出PDF文件?别说PDF了!GIF我都能给你导出来
  14. 简约商务风ppt模板推荐
  15. APP推广关键词的怎么选词?
  16. java与设计模式-观察者模式
  17. 使用Helm在k8s集群上部署以太坊私有链
  18. WAF检测率及误报测试工具Gotestwaf
  19. C语言 输出三角形数列 for循环
  20. python中向字典循环加入键值对

热门文章

  1. 牛腩新闻发布系统(2)使用存储过程查询表
  2. ubuntu通过xmange连接桌面
  3. enterprise portal
  4. .net Redis使用公共方法引用CSRedisCore
  5. Exception异常
  6. JMeter处理jdbc请求后的响应结果
  7. Perl中的单行凝视和多行凝视
  8. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects...
  9. TCP,IP,HTTP,SOCKET区别和联系
  10. SQL alter 的几种用法