【问题标题】:Removing items from array list without using position从数组列表中删除项目而不使用位置
【发布时间】:2019-07-06 02:20:58
【问题描述】:

大家早上好

目前我有一个 ArrayList,它允许我通过一组在大多数情况下完美的项目位置来删除。但我想知道是否可以删除我的东西,例如一个长变量。

我当前在我的 recyclerView 适配器上设置的当前 ArrayList。

private ArrayList<NoteInfoModal> mAdapter = new ArrayList (List)

在 NoteInfoModal 下,我们还有用于我的 recyclerView 的多行的 getter 和 setter,例如名称、描述、Col ID 等...

现在删除一个项目我只是使用下面的代码

mAdapter.remove(position)

有没有办法改变这个 ArrayList,所以我可以例如从这个 arraylist 中删除一个结果而不使用位置,而是使用 arraylist 中的一个项目,例如标识号?

谢谢

【问题讨论】:

  • 您可以按位置或对象本身删除。如果您想通过对象的某个字段(e.g. col id)删除,那么您首先必须找到具有该 col id 的对象。

标签: android arrays arraylist android-recyclerview


【解决方案1】:

是的,但您必须为此运行一个 for-each 循环。

//suppose you have col_Id;
for(NoteInfoModel noteInfoModel : mAdapter) {
  if(noteInfoModel.getColId == col_Id) {
    mAdapter.remove(noteInfoModel);
    break;
  }
}

【讨论】:

  • 但是我认为如果有大量结果那么这可能会导致应用程序滞后是正确的吗?
  • 使用 notifyItemRemoved 和 IIRC 也 notifyItemRangeChanged 更新 RecyclerView 没有任何延迟。
  • 它将引发并发修改请检查 java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList) 的 java.util.ConcurrentModificationException .java:859)
  • 在我的代码中工作,因为我无法在我的 recyclerView 中实现哈希码
  • TakeInfo 以任何方式删除该行和上一行,因为它们之间存在 1 Col_Id 差异?
【解决方案2】:

当然,不用位置来移除,你只需将要从 ArrayList 中移除的 Object 放入即可:

mAdapter.remove(yourObject)

看看official documentation

Ganesh Gudghe 还提到,必须为您的类 NoteInfoModal 实现 hashCode() 和 equals()。

【讨论】:

  • 在你需要 @Override hashCode() 和 equals() 之前
  • 跟进问题到您的回答 arnoduebel 如果放例如 mAdapter.remove(ID) 我得到响应(可能不包含类型的对象)并且行没有被删除
  • 就像 Ganesh Gudghe 提到的,它需要为你的类 NoteInfoModal 实现 hashCode() 和 equals()。编辑了我的答案
  • 不能说我以前用过它们,但仍在学习。我会做我的研究
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多