删除回收器视图项目的循环出错。 (使循环崩溃应用程序)
Error in loop to remove recycler view items. (making a loop crashes app)
现有代码:
int length = MyData.dates.length;
for(int i = 0; i<length; i++){
View x = mRecyclerView.getChildAt(i);
if(x != null) {
length--;
//if(MyData.dates[i].before(today)){
RecyclerView.ViewHolder mViewHolder = mRecyclerView.findViewHolderForPosition(i);
TextView textViewName = (TextView) mViewHolder.itemView.findViewById(R.id.textViewMatch);
String selectedName = (String) textViewName.getText();
int selectedItemId = -1;
if (selectedName.equals(MyData.matchArray[i])) {
selectedItemId = MyData.id_[i];
}
removedItems.add(selectedItemId);
matches.remove(i);
mAdapter.notifyItemRemoved(i);
//}
}
}
当我 运行 该功能时,我的应用程序崩溃了。原因是:java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
让i的值=1就完美的实现了这个功能。这是什么原因,我怎样才能使循环真正循环?
数组:
static String[] timingArray = {"JAN-15-2015","JAN-18-2015","JAN-25-2015","JAN-19-2015"};
static Integer[] id_ = {0, 1, 2, 3, 4};
static Date[] dates = new Date[timingArray.length];
我还有其他阵列,我认为它们不会造成麻烦。
项目基于教程:THIS
点击删除效果很好。
错误:
java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.remove(ArrayList.java:403)
at com.wc.gap.worldcupfixture.MainActivity.onSectionAttached(MainActivity.java:186)
at com.wc.gap.worldcupfixture.MainActivity$PlaceholderFragment.onAttach(MainActivity.java:294)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:454)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
如果你有循环
for( int i = 0; i < some.length; ++i ){
// ...
someList.remove( i );
}
这几乎与 运行 绑定到 IndexOutOfBounds 中,因为 someList
在每次迭代中都会缩短,并且 i 的连续值将超过最大可用索引。
可以通过使用递减的索引值来解决。
现有代码:
int length = MyData.dates.length;
for(int i = 0; i<length; i++){
View x = mRecyclerView.getChildAt(i);
if(x != null) {
length--;
//if(MyData.dates[i].before(today)){
RecyclerView.ViewHolder mViewHolder = mRecyclerView.findViewHolderForPosition(i);
TextView textViewName = (TextView) mViewHolder.itemView.findViewById(R.id.textViewMatch);
String selectedName = (String) textViewName.getText();
int selectedItemId = -1;
if (selectedName.equals(MyData.matchArray[i])) {
selectedItemId = MyData.id_[i];
}
removedItems.add(selectedItemId);
matches.remove(i);
mAdapter.notifyItemRemoved(i);
//}
}
}
当我 运行 该功能时,我的应用程序崩溃了。原因是:java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
让i的值=1就完美的实现了这个功能。这是什么原因,我怎样才能使循环真正循环?
数组:
static String[] timingArray = {"JAN-15-2015","JAN-18-2015","JAN-25-2015","JAN-19-2015"};
static Integer[] id_ = {0, 1, 2, 3, 4};
static Date[] dates = new Date[timingArray.length];
我还有其他阵列,我认为它们不会造成麻烦。
项目基于教程:THIS
点击删除效果很好。
错误:
java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.remove(ArrayList.java:403)
at com.wc.gap.worldcupfixture.MainActivity.onSectionAttached(MainActivity.java:186)
at com.wc.gap.worldcupfixture.MainActivity$PlaceholderFragment.onAttach(MainActivity.java:294)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:454)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
如果你有循环
for( int i = 0; i < some.length; ++i ){
// ...
someList.remove( i );
}
这几乎与 运行 绑定到 IndexOutOfBounds 中,因为 someList
在每次迭代中都会缩短,并且 i 的连续值将超过最大可用索引。
可以通过使用递减的索引值来解决。