Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android ArrayList-逐个添加项会导致IndexOutOfBoundsException_Java_Android_Arraylist_Indexoutofboundsexception - Fatal编程技术网

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);
}