listadapter 中未调用 DiffCallback

2024-02-02

您好,我正在尝试在我的应用程序中使用 listadapter 和 diffcallback 。不知何故,当我做某事时,视图根本不更新。

当我将一些日志放入回调内的“areItemsTheSame”和“areContentsTheSame”中时,根本不会调用它。

这是我的主要活动

class MainActivity : AppCompatActivity() {

private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: TodoAdapter
private lateinit var viewManager: RecyclerView.LayoutManager

private lateinit var viewModel : TodoViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    //viewModel
    viewModel = ViewModelProviders.of(this).get(TodoViewModel::class.java)
    viewManager = LinearLayoutManager(this)
    viewAdapter = TodoAdapter(viewModel.todos)

    binding.btnNew.setOnClickListener {
        viewModel.todos.value!!.add(Todo(3, binding.newText.text.toString()))
    }

    recyclerView = binding.myRecyclerView

    recyclerView.apply {
        layoutManager = viewManager
        adapter = viewAdapter
    }

    viewModel.todos.observe(this, Observer{ list ->
        viewAdapter.submitList(list)
        Log.i("debug", "im @observe " + list.toString())
    })

}

}

这是我的适配器

 class TodoAdapter(var items: MutableLiveData<ArrayList<Todo>>):
    ListAdapter<Todo, TodoAdapter.MyViewHolder>(TodoDiffCallback()) {

// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    // create a new view
    val inflater = LayoutInflater.from(parent.context)
    val binding  = ListItemBinding.inflate(inflater)

    return MyViewHolder(binding)
}


override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.todoText.text = getItem(position).task

    //delete
    holder.delBtn.setOnClickListener {
        items.value!!.removeAt(position)
        submitList(items.value)
        Log.i("debug", "@adapter what is items " + items.value.toString())
    }

//override fun getItemCount() = items.value!!.size


class MyViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root) {
    val todoText = binding.todoItem
    val delBtn = binding.btnDelete
    val ediBtn = binding.btnEdit
}

}

class TodoDiffCallback : DiffUtil.ItemCallback<Todo>(){

override fun areItemsTheSame(p0: Todo, p1: Todo): Boolean {
    Log.i("debug", " here " +p0 + " inItems " + p1 )
    return p0 == p1
}

override fun areContentsTheSame(p0: Todo, p1: Todo): Boolean {
    Log.i("debug", "here " + p0 + " inContents" + p1 )
    return p0.equals(p1)
}

}

我的视图模型

class TodoViewModel: ViewModel() {

val todos = MutableLiveData<ArrayList<Todo>>()

init{
    todos.value = arrayListOf(
        Todo(1, "cooking"),
        Todo(2, "washing")
    )
}

}

不幸的是,android 文档没有给出更多的例子。

同样,我的 DiffUtil 类中的两个“日志”根本没有被调用。当我单击“删除”按钮时,用户界面未更新,但日志显示正确的结果。

thanks


当前工作解决方案

我读到了有关“在 liveData 中观察”的内容,直到我调用“setValue”方法时它才会触发。

所以我在 ViewModel 类中添加了一些新方法,在其中应用 setValue 添加 newItem 的示例

fun addTodo(text: String) {
    _todos.value!!.add(Todo(3, text))
    _todos.setValue(_todos.value)
}

到目前为止它有效。我现在只在 MainActivity 中的观察中运行一次 SubmitList

   viewModel.todos.observe(this, Observer{ list ->
        viewAdapter.submitList(list.toMutableList())
    })

我仍然有一个问题,即项目的“位置”仍然不正确。例子:

  1. 当我删除所有项目时,应用程序崩溃
  2. 当我从第二个位置(数组[1])删除项目然后删除新添加的任务后,它将给出“错误索引超出范围”

所以 onBindViewHolder 中的“位置”在删除/或执行其他操作后没有改变 [更新](问题解决通过使用:holder.getAdapterPosition())

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

listadapter 中未调用 DiffCallback 的相关文章

  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 在屏幕上随机生成一个圆圈并将其设为绿色或红色

    所以我一直在尝试制作一个游戏应用程序 它可以在 Android 屏幕上随机显示带有文本的红色按钮或带有文本的绿色按钮 如果有人可以帮助我 我将不胜感激 另外 如果有人知道如何做到这一点 我想慢慢地产生更快的酷优势 谢谢 SuppressLi
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • 将 ArrayList 保存在捆绑包 savingInstanceState 中

    ArrayList 是在类级别定义的 这些是我保存的实例方法 Override protected void onSaveInstanceState Bundle outState super onSaveInstanceState out
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何在代码中设置TextView的文字颜色?

    在 XML 中 我们可以通过以下方式设置文本颜色textColor属性 比如android textColor FF0000 但如何通过编码来改变它呢 我尝试过类似的东西 holder text setTextColor R color R
  • MAT(Eclipse 内存分析器)- 如何从内存转储中查看位图

    I m analyzing memory usage of my Android app with help of Eclipse Memory Analyzer http www eclipse org mat also known as
  • BluetoothLeScanner 服务内部问题

    Update从Android 10以上我认为你需要ACCESS BACKGROUND LOCATION权限 因此 如果此代码在最新的 Android 版本上不起作用 就是针对此问题的 ACCESS BACKGROUND LOCATION 受
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • 找不到资源矢量绘图的异常

    我将在某些设备上运行我的应用程序 其崩溃日志如下 01 04 16 54 02 206 7466 7466 com lawnmowers E AndroidRuntime FATAL EXCEPTION main Process com l
  • 在 Kotlin 中将数组转换为列表

    我尝试用 与java相同 来做到这一点 val disabledNos intArrayOf 1 2 3 4 var integers Arrays asList disabledNos 但这并没有给我一个清单 有任何想法吗 Kotlin
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • Exif 方向标签返回 0

    我正在开发一个自定义相机应用程序 我面临以下问题 当我尝试使用检索方向时ExifInterface 它总是返回 0 ORIENTATION UNDEFINED 这使我无法将图像旋转到正确的状态 从而无法正确显示 我使用示例代码来设置相机旋转
  • 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

    我已将 firebase 消息传递添加到我的 Flutter 项目中 在 iOS 上运行良好 在 Android 上运行时出现错误 Android dependency androidx localbroadcastmanager loca

随机推荐

  • Angular 2 错误:尝试使用被破坏的视图:DetectChanges 错误:尝试使用被破坏的视图:ViewDestroyedError 处的 detectorChanges

    我正在使用 ng2 toastr 并收到以下错误 https www npmjs com package ng2 toastr https www npmjs com package ng2 toastr Attempt to use a
  • 如何防止请求返回304

    浏览器什么时候不向服务器发出文件请求 换句话说 我有一个正在提供服务的 JavaScript 文件 它的 HTTP 响应头有一个ETag Cache Control public and Expires Tue 19 Jan 2038 03
  • 如何解决 VS Code 不支持车把部分的问题?

    我使用车把作为我的项目的模板引擎 我正在使用 Prettier 进行格式化 但在格式化 hbs 文件期间我收到错误 SyntaxError 不支持车把部分 我尝试在互联网上寻找解决方案但失败了 这是完整的错误日志 SyntaxError 不
  • 断言两个 java bean 是等价的

    这个问题 https stackoverflow com questions 472626 how to generically compare entire java beans很接近 但仍然不是我想要的 我想以通用的方式断言两个 bea
  • 有没有办法让 ANT 任务在 Windows Vista 中以管理员身份运行?

    作为安装程序的一部分 我需要从 ANT 运行批处理文件 如果我以管理员身份运行 cmd exe 并运行批处理文件 一切都会很好 因为它具有适当的管理权限 当从 ant 执行批处理文件时 它会失败 就像我在没有管理权限的情况下运行批处理文件一
  • Angular 跨服务通信

    我有一个统计应用程序 在我的页面左侧有主题列表 顶部有组列表 主要部分包含与主题和组相关的统计项目 我还有几个服务为我的应用程序提供业务逻辑 为了简单起见 我们来谈谈其中的三个 主题服务 群组服务 and 统计服务 最终用户可以操作主题和组
  • 如何让 Android Studio 指向我的 SDK 源代码?

    Android Studio 调试器指向错误版本的 SDK 源代码 因此我无法单步执行系统代码 如何让它使用特定的 SDK 源路径 需要明确的是 它指向正确的 SDK 但 SDK 源代码的版本错误 16 而不是 17 提前致谢 这有点令人困
  • Magento:订购可配置产品后,由于缺货而被取消

    我的问题是 我有一个产品 里面有简单的产品 也许 T 恤白色尺码 S XL 和一些颜色 现在 如果我订购其中之一 则会通过订单确认电子邮件取消该订单 我认为这是库存的问题 但我不知道 每种商品有 99 种库存 全部已激活并准备发货 有谁遇到
  • NHibernate:多对多关系不起作用

    我有以下数据库架构 http lh4 ggpht com SDci0Pf3tzU SdM3XnAmmxI AAAAAAAAEps Ie3xW3ZVNfQ s400 styleerror png http picasaweb google c
  • 如何找出 Django 中出现的 500 错误?

    当我访问由 Django 生成的服务器上的 Django 应用程序中的页面 http 68 123 151 234 static quickstart html 时 该页面显示 A server error occurred Please
  • 无法在android的webview中使用javascript播放音频

    在 Android 手机上 当我在 html 文件中使用以下代码时 音频正在播放 但是当我删除 自动播放 属性时 我无法在 webview 上播放音频 有人有解决方案吗
  • 如何在 Oracle 中“打开”XML 数据

    下面是我想用 PL SQL 重写的一些 TSQL 的示例 DECLARE xml XML SET xml
  • 使用 ButterKnife 库在 1 个片段中包含 2 个不同的视图

    我目前正在尝试使用 Android 的 ButterKnife 库来处理一些样板代码 https github com JakeWharton butterknife https github com JakeWharton butterk
  • 如何跟踪用户在网站上的时间

    我希望跟踪用户在网站上的平均时间 与谷歌分析的方式相同 以进行内部管理 做到这一点最简单的方法是什么 您可以通过以下方式获取时间 用户访问您的网站后 将 cookie 中的当前时间保存为 已访问 并且在下次访问时您可以获取它 如果已设置 更
  • 同时滚动多个div

    我正在尝试滚动多个div同时 当我滚动其中一个时div 我想报告所有div中的滚动 我动态创建 div 所以我使用这个功能document getElementsByClassName sub category container得到我所有
  • 在网格视图内填充下拉列表

    我在 Gridview 中有一个下拉列表 我必须显示与每个 id 关联的记录 并且该 ID 包含超过 10 条记录 那么我如何显示它们 protected void GridView1 RowDataBound object sender
  • libgdx 中四元数的 euler getPitch()、getRoll()、getYaw() 的旋转顺序?

    将四元数转换为欧拉角时 通常必须有轴旋转的顺序 例如这种可视化 http quaternions online libgdx 是如何工作的 四元数类具有以下功能 getRoll Math asin MathUtils clamp 2f w
  • 缩短(限制)句子的长度

    我有一列很长的名字 我想把它们剪到最大40 个字符长度 样本数据 x lt c This is the longest sentence in world so now just make it longer No in fact this
  • 在批处理文件中将反斜杠转换为转发[重复]

    这个问题在这里已经有答案了 将所有反斜杠转换为批处理文件中路径中的转发的最简单方法是什么 因为我需要使用 bash 来执行 SET string D path to folder ECHO string 基本上 您需要首先将字符串值存储到环
  • listadapter 中未调用 DiffCallback

    您好 我正在尝试在我的应用程序中使用 listadapter 和 diffcallback 不知何故 当我做某事时 视图根本不更新 当我将一些日志放入回调内的 areItemsTheSame 和 areContentsTheSame 中时