Java Android ArrayList-逐个添加项会导致IndexOutOfBoundsException
我使用以下函数来设置过滤列表的动画(实际上我曾经在某个地方发现过,不知道在哪里):Java Android ArrayList-逐个添加项会导致IndexOutOfBoundsException,java,android,arraylist,indexoutofboundsexception,Java,Android,Arraylist,Indexoutofboundsexception,我使用以下函数来设置过滤列表的动画(实际上我曾经在某个地方发现过,不知道在哪里): 事实上,这是怎么发生的?applyAndAnimateAdditions中的循环从0开始,如果项目不在列表中,则逐个添加项目。索引异常是如何发生的?您可以添加此项,以检查位置是否等于或大于数组列表的(=),只需将该项添加到数组列表的末尾即可 public void addItem(int position, T item) { if(position >= mListItems.size())
事实上,这是怎么发生的?
applyAndAnimateAdditions
中的循环从0开始,如果项目不在列表中,则逐个添加项目。索引异常是如何发生的?您可以添加此项,以检查位置是否等于或大于数组列表的(=
),只需将该项添加到数组列表的末尾即可
public void addItem(int position, T item) {
if(position >= mListItems.size())
mListItems.add(mListItems.size()-1, item);
else
mListItems.add(position, item);
notifyItemInserted(position);
}
因此,这里是您的问题,您正在迭代newItems
,但您正在添加到mListItems
,您可以添加此项来检查位置是否等于或大于=
)到数组列表的大小只需将该项添加到数组列表的末尾即可
public void addItem(int position, T item) {
if(position >= mListItems.size())
mListItems.add(mListItems.size()-1, item);
else
mListItems.add(position, item);
notifyItemInserted(position);
}
这里是您的问题,您正在迭代新项目
,但您正在添加到mListItems
我知道一个解决方案。。。正如你所说,这就是我能做的。但我还是想知道问题是什么。。。因为我看不到。这不应该发生,永远不会。。。我想知道我也看不到什么…你从哪个方法调用addItem方法?我用以下内容编辑了我的答案:这是你的问题,你正在迭代newItems,但你正在添加到mListItemsCorrect。但是如果mListItems不包含新项目的条目,我会将此条目添加到mListItems中,以便mListItems应该始终至少具有与迭代器计数器相同的项目数。。。它在迭代过程中不断增长…您是否可能以异步方式调用它?我知道一个解决方案。。。正如你所说,这就是我能做的。但我还是想知道问题是什么。。。因为我看不到。这不应该发生,永远不会。。。我想知道我也看不到什么…你从哪个方法调用addItem方法?我用以下内容编辑了我的答案:这是你的问题,你正在迭代newItems,但你正在添加到mListItemsCorrect。但是如果mListItems不包含新项目的条目,我会将此条目添加到mListItems中,以便mListItems应该始终至少具有与迭代器计数器相同的项目数。。。它在迭代过程中不断增长……您是否可能以异步方式调用它?您在哪里确保mListItems
和newItems
具有相同的大小?它们不必如此。我只叫animateTo。。。其中三个调用的顺序确保,我首先删除所有不在筛选列表中的项,然后添加所有新项,然后移动所有已经在列表中但现在有新位置的项。要么我很愚蠢,要么你的逻辑毫无意义(至少对我来说):你有两个大小未知的列表。首先,遍历列表1并删除列表2中没有的所有内容。然后遍历列表2,并使用特定索引将列表1中不存在的所有内容添加到该列表中。如果“新内容”的索引大于列表1的大小,则第二个“功能”将失败。所以我还是不明白背后的逻辑:(.如果发生这种情况,第二个将失败,是的。但是我将所有项目添加到列表1中,如果它们不在其中,那么列表1应始终至少与当前迭代器索引一样大…不,不完全是。我可以将同一项目添加到列表2中一百次,列表1只需要其中一个项目即可满足检查mListItems.contains(项目)
。因此列表2的下一个新项可以在索引100上,但列表1在索引0上仍有一项。此外,您是否在“item”类中正确重写了equals
和hashCode
方法?(如果它是自写类而不是现有类)在哪里可以确保mListItems
和newItems
具有相同的大小?它们不必具有相同的大小。我只调用animateTo…其中三个调用的顺序确保,我首先删除所有不在筛选列表中的项目,然后添加所有新项目,然后移动已在列表中的所有项目但现在有一个新的位置要么我很笨,要么你的逻辑毫无意义(至少对我来说):你有两个大小未知的列表。首先你迭代列表1,删除列表2中不存在的所有内容。然后你迭代列表2,使用特定索引将列表1中不存在的所有内容添加到该列表中。第二个“功能”如果“new stuff”的索引大于列表1的大小,则失败。因此,我仍然无法理解其背后的逻辑:(.如果发生这种情况,第二个将失败,是的。但是我将所有项目添加到列表1中,如果它们不在其中,那么列表1应始终至少与当前迭代器索引一样大…不,不完全是。我可以将同一项目添加到列表2中一百次,列表1只需要其中一个项目即可满足检查mListItems.contains(项目)
。因此列表2的下一个新项可以在索引100上,但列表1在索引0上仍有一项。此外,您是否在“item”类中正确重写了equals
和hashCode
方法?(如果它是自写类而不是现有类)
public void addItem(int position, T item) {
if(position >= mListItems.size())
mListItems.add(mListItems.size()-1, item);
else
mListItems.add(position, item);
notifyItemInserted(position);
}