Java 操作ArrayAdapter时ArrayIndexOutOfBoundsException

Java 操作ArrayAdapter时ArrayIndexOutOfBoundsException,java,android,listview,adapter,Java,Android,Listview,Adapter,长话短说:我有一个带有customAdapter(称为MathAdapter)的listView。此适配器处理CalculationModel类型的ArrayList。默认情况下,我的列表中约有15个计算模型,但在特殊情况下,我必须删除其中的6个 由于我对安卓系统开发相当陌生(我来自iOS),我的第一个基本问题是: 人们通常在哪里操作ListData?在我的例子中,一个片段初始化适配器并传递我的数据列表。在我的应用程序的生命周期中,我操纵此列表并调用notifiyDataSetChanged。一

长话短说:我有一个带有customAdapter(称为MathAdapter)的listView。此适配器处理CalculationModel类型的ArrayList。默认情况下,我的列表中约有15个计算模型,但在特殊情况下,我必须删除其中的6个

由于我对安卓系统开发相当陌生(我来自iOS),我的第一个基本问题是:

人们通常在哪里操作ListData?在我的例子中,一个片段初始化适配器并传递我的数据列表。在我的应用程序的生命周期中,我操纵此列表并调用notifiyDataSetChanged。一切正常,我可以一次删除或添加1个CalculationModel,没有任何问题

删除6个CalculationModels时也没有问题,效果也很好。当我尝试使用以下错误日志重新插入应用程序时,应用程序崩溃:

04-27 07:48:59.194 1766-1766/com.example.test E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.example.test, PID: 1766
   java.lang.ArrayIndexOutOfBoundsException: length=11; index=11
       at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:8271)
       at android.widget.ListView.layoutChildren(ListView.java:1600)
       at android.widget.AbsListView.onLayout(AbsListView.java:2528)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1440)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1440)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at com.example.test.TouchDisableView.onLayout(TouchDisableView.java:57)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:15655)
       at android.view.ViewGroup.layout(ViewGroup.java:4856)
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2284)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2004)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1236)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6471)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
       at android.view.Choreographer.doCallbacks(Choreographer.java:603)
       at android.view.Choreographer.doFrame(Choreographer.java:573)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
       at dalvik.system.NativeStart.main(Native Method)
说清楚一点,我对Java并不陌生,我知道ArrayIndexOutOfBounds是个问题,但我不知道在哪里会发生这种情况,因为我的列表和适配器中的项计数都高于11(如预期的14)

代码:

列表数据;
List backupdatea=new ArrayList();
@凌驾
恢复时公开作废(){
if(mathApp.isCleanPhase){
removeNonClearData();
}否则{
addNonClearData();
}
adapter.notifyDataSetChanged();
super.onResume();
}
public void removeNonClearData(){
if(backupdatea.size()>0)返回;
对于(int i=0;i
编辑:忘了提一下,数据基本上是按照我想要的方式加载的,但是当我在列表中再次滚动时,应用程序崩溃了。所有的数据都在我想在那里看到的列表中,但是当向上滚动时,-->崩溃

正如前面提到的,我不明白这个错误是从哪里来的,因为日志没有提供任何关于它的信息…

经过长时间(基本上是过去两天)的沮丧和困惑,我终于理解了ListView适配器是如何工作的(至少我希望如此)

when you are removing data from array call notifyDataSetChanged(); 
如问题中所述,我有以下设置: 包含数据列表的片段和适配器,适配器在初始化时获取此数据列表

现在,适配器在处理数据时有两种不同的行为

如果只编辑列表中的一个对象(例如,我想更改位置4上CalculationModel的参数“value”),则一切正常,并且notifyDataSetChanged()接受更改

如果从列表中删除一个完整的对象,notifyDataSetChanged()也会工作并执行预期的工作

但是,如果要将新对象添加到列表中(或者在我的情况下,重新插入删除的对象),则必须重新创建整个适配器,因为notifyDataSetChanged()不再有效

感谢您的帮助,如果没有评论中的输入,我可能无法做到这一点。

经过长时间(基本上是过去两天)的沮丧和困惑,我终于理解了ListView适配器的工作原理(至少我希望如此)

如问题中所述,我有以下设置: 包含数据列表的片段和适配器,适配器在初始化时获取此数据列表

现在,适配器在处理数据时有两种不同的行为

如果只编辑列表中的一个对象(例如,我想更改位置4上CalculationModel的参数“value”),则一切正常,并且notifyDataSetChanged()接受更改

如果从列表中删除一个完整的对象,notifyDataSetChanged()也会工作并执行预期的工作

但是,如果要将新对象添加到列表中(或者在我的情况下,重新插入删除的对象),则必须重新创建整个适配器,因为notifyDataSetChanged()不再有效


感谢您的帮助,如果没有注释中的输入,我可能无法完成此操作。

您可以发布代码吗?添加的代码。希望它能帮助出现错误的列表?数据或BackUpdatea?数据是在OnCreateView中传递给适配器的列表,我不是很确定,但我认为问题出在这里:
BackUpdatea.add(data.remove(i));i--;
。您正在从
数据中删除一些条目,但是循环应该循环,直到达到
数据.size()
为止。即使从
i
进行子循环,循环也会继续。因此,在任何时候,您都会达到一个不在
数据
列表中的值。
数据.size()
循环头上引用的不会最小化,因此您在这里有一个错误的值。可能我有点困惑,但这是我的假设…您可以发布代码吗?添加的代码。希望它能帮助出现错误的列表?数据还是backupdatea?数据是在onCreateView中传递给适配器的列表我不是很确定,但我认为nk这里的任何地方都有问题:
backupdatea.add(data.remove(i));i--
。您正在从
data
中删除一些条目,但是循环应该循环,直到达到
data.size()
为止。即使您从
i
进行子循环,循环也会继续。因此,在任何时候,您都会达到一个不在
数据中的值
when you are removing data from array call notifyDataSetChanged();