在Android中使用notifyItemRemoved或notifyDataSetChanged与RecyclerView

2024-01-25

我正在创建一个要使用 RecyclerView 显示的卡片列表,其中每张卡片都有一个用于从列表中删除该卡片的按钮。

当我使用通知项目已删除()要删除 RecyclerView 中的卡片,它会删除该项目并进行良好的动画处理,但列表中的数据未正确更新。

如果不是那样,我切换到通知数据集更改()然后列表中的项目被删除并正确更新,但卡片没有动画。

有人有使用notifyItemRemoved()的经验并知道为什么它的行为与notifyDataSetChanged不同吗?

这是我正在使用的一些代码:

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    if(position >0){
        RiskViewHolder riskHolder = (RiskViewHolder)holder;
        final int index = position - 1;
        final DetectedIssue anIssue = issues.get(index);

        riskHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int index = issues.indexOf(anIssue);
                    issues.remove(anIssue);
                    notifyItemRemoved(index);

                    //notifyDataSetChanged();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

@Override
public int getItemCount() {
    return (issues.size()+1);
}

Use notifyItemRangeChanged(位置, getItemCount());在notifyItemRemoved(位置)之后;
您不需要使用索引,只需使用位置即可。请参阅下面的代码。

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    if(position >0){
        RiskViewHolder riskHolder = (RiskViewHolder)holder;

        riskHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    issues.remove(position);
                    notifyItemRemoved(position);
                    //this line below gives you the animation and also updates the
                    //list items after the deleted item
                    notifyItemRangeChanged(position, getItemCount());

                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

@Override
public int getItemCount() {
    return issues.size();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Android中使用notifyItemRemoved或notifyDataSetChanged与RecyclerView 的相关文章

随机推荐

  • PHPUnit 存根类方法声明为“final”

    我正在为一个类方法编写一个单元测试 该方法使用模拟调用另一个类的方法 只有需要调用的方法被声明为最终方法 因此 PHPUnit 无法模拟它 我可以采取不同的方法吗 example 被嘲笑的班级 class Class To Mock fin
  • npm 无法在 Windows 中运行

    我安装了node js和npm 当我在 Windows 命令提示符下输入 npm v 它返回 2 15 1 但是当我尝试安装如下软件包时 npm install xml parser 我看到有东西正在加载 然后就什么也没有了 出了什么问题
  • 为什么信号处理程序中的打印操作可能会改变死锁情况?

    我得到的简单程序如下 import threading import time import signal WITH DEADLOCK 0 lock threading Lock def interruptHandler signo fra
  • 如何在进程退出之前强制 Nodejs Winston 日志记录到文件

    我在用温斯顿 3 https github com winstonjs winston记录我的数据 但有时它在进程退出之前没有记录错误 以下进程将退出 不登录logfile log const winston require winston
  • Windows x64 的串行/Com 端口监视器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谁能推荐一些好的 Com 端口监控工具 比如 Portmon 它也可以在 Windows x64 上运行
  • 在 WordPress 站点中加载 jquery.js 后加载 javascript 代码

    我在 WordPress 网站的主页上有一个基于 jquery 的自定义滑块 我正在主题的functions php 文件中使用以下代码加载jQuery jquery js 和滑块js jquery advanced slider js f
  • Rails 3 - nil 的未定义方法“map”:NilClass 用于我自己的验证

    我遇到了很奇怪的问题 我有Timetable模型并尝试编写我的自定义验证 所以 现在我只是尝试为字段添加测试错误以确保一切正常 但这不起作用 因此 我尝试更新时间表模型的对象 但是当我不使用测试自定义验证时 一切都很完美 否则我会得到这样的
  • 将 geom_text 中的图例文本颜色与符号匹配[重复]

    这个问题在这里已经有答案了 我正在尝试将图例的文本与分解变量生成的文本的颜色进行颜色匹配geom text 这是一个最小的工作示例 df lt data frame a rnorm 10 b 1 10 c letters 1 10 d c
  • Swift 三个双引号

    我是斯威夫特的新手 该文档说 对于占用多行的字符串 请使用三个双引号 只要与结束引号的缩进相匹配 每个带引号的行开头的缩进就会被删除 例如 let quotation Even though there s whitespace to th
  • 类型错误:“list”和“int”实例之间不支持“>=”

    嗨 我遇到了上述错误 问题出在最后一个函数 get student average 上 如果 results 存储 get average student 值 为什么它不能返回 get letter grade results 的结果 ll
  • 求 pi 的值直到 50 位

    我想计算 PI 的值直到 50 位 如何在java中实现小数点后50位 您无法使用默认数据类型执行此操作 因为您需要 50 位数字 50 log 2 log 10 166 位 这里 BigDecimal 是您可以使用的一种类型 但您应该记住
  • nil 的 Ruby 用例,相当于 Python None 或 JavaScript undefined

    鲁比的怎么样nil体现在代码中 例如 在 Python 中 当默认参数引用另一个参数时 您可以使用 None 作为默认参数 但在 Ruby 中 您可以引用 arg 列表中的其他参数 请参阅这个问题 https stackoverflow c
  • npm 发布 - 从 package.json 中删除脚本?

    在发布我的脚本之前 我在 package json 下有许多脚本来编译咖啡脚本 打字稿和仅限开发人员的命令 一旦发布就没有任何意义 我想知道是否有删除 package json 下某些脚本的程序 考虑到在发布包时 它也会发布 package
  • 在 Matter.js 中旋转相机

    我正在开发一款以太空为背景的自上而下的物理游戏 我希望旋转到视图时始终显示玩家的船朝上 即使船可以旋转 我搜索了文档 但没有找到任何有关旋转世界或渲染器的信息 但我可能不知道要查找的正确术语 这对于 Matter js 来说是可能的吗 我不
  • 使用 ng-template 在 Angular 10 中仅显示博客中的相关条目

    我有一个用 Strapi 制作的博客后端 您可以在其中添加一些内容类型 例如标题字段 描述字段和内容字段 我还有一个布尔内容类型来设置博客是否相关 我在 Angular 中设置了一个 ngFor 来显示我所有的博客条目 但我只想展示相关的内
  • 为什么不同 Android 版本的 apk 大小会增加

    我创建了一个简单的应用程序 由 android studio 生成的 apk 大小为 1 MB 然后我安装在android 2 3版本大小增加到3 48 MB 然后我安装在android 5 0版本大小增加至 5 48 MB 我的问题只是为
  • socket.error:[errno 99] 无法分配请求的地址:flask 和 python

    我有同样的问题 and here https stackoverflow com questions 19246103 socket errorerrno 99 cannot assign requested address and nam
  • 单向来源困境

    我在用OneWayToSource绑定 它似乎总是将我的源属性设置为 null 为什么会这样 这给我带来了麻烦 因为我需要源属性中目标属性的值而不是 null 这是我的代码 MyViewModel cs public class MyVie
  • 使用 Aeson 解析嵌套 JSON 中的数组

    我正在尝试写一个FromJSON埃森的功能 JSON total 1 movies id 771315522 title Harry Potter and the Philosophers Stone Wizard s Collection
  • 在Android中使用notifyItemRemoved或notifyDataSetChanged与RecyclerView

    我正在创建一个要使用 RecyclerView 显示的卡片列表 其中每张卡片都有一个用于从列表中删除该卡片的按钮 当我使用通知项目已删除 要删除 RecyclerView 中的卡片 它会删除该项目并进行良好的动画处理 但列表中的数据未正确更