大家好,我是Android编程初学者,也是新手,在我的android项目中我在下面的场景中遇到了一个问题,
我有一些包含大量项目的列表,这个列表有滚动条,当开始滚动列表中间的特定点时程序崩溃并要求强制关闭.. logcat说它是由于ArrayIndexOutOfBounds Exception,我不知道是什么修改应该为此做..任何身体请帮助我,如果它是已知的问题..
我的代码..
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return true;
}
public int getCount() {
if (_UiRows != null)
return _UiRows.size();
return 0;
}
public Object getItem(int position) {
return _UiRows.get(position);
}
// This function essentially disabled the flyweight caching by giving every row a unique type
// This works because we end up saving refreshes and thereby reducing GC
public int getItemViewType(int position) {
if (_UiRows == null)
return 0;
return position;
}
public int getViewTypeCount() {
return 100; // Max edit rows
}
public long getItemId(int position) {
return position;
}
public EditRowView getNewView(Context ctx) {
return new EditRowView(ctx);
}
private EditViewProvider findCustomViewProvider(EditRowData row) {
for (EditViewProvider p : _CustomViewProviders) {
if (p.isCustomView(row))
return p;
}
return null;
}
public View getView(int position, View convertView, ViewGroup parent) {
EditRowView v = null;
EditRowData row = (EditRowData) _UiRows.get(position);
// NOTE:
// ListItemType starting at 0
// Invisible -2 for hidden ones
// Custom types starting at VIEWTYPE_CUSTOM_OFFSET, registered via RegisterCustomViewProvider
// Create a view based on view type
EditViewProvider viewProvider = findCustomViewProvider(row);
if (row.IsVisible() == false) {
return new View(parent.getContext());
} else if (viewProvider != null) {
return viewProvider.getView(row, convertView, parent);
} else {
// TODO: (Phase II) This area could use some refactoring to handle various types individually.
// Currently app types are handled by EditRowView, using more memory than necessary
if (convertView != null && convertView instanceof EditRowView) {
v = (EditRowView) convertView;
} else {
v = getNewView(parent.getContext());
v.SetParent(this);
v.SetBusinessLogic(_BL);
}
v.BindDataItem(row);
}
return v;
}
logcat片段......
> 11-25 16:08:08.667: E/IR-ProcessUIRequest(859): Request:
> TruckStatusTable, Action: 11-25 16:08:08.797: D/AndroidRuntime(859):
> Shutting down VM 11-25 16:08:08.797: W/dalvikvm(859): threadid=1:
> thread exiting with uncaught exception (group=0x40015560) 11-25
> 16:08:08.918: E/AndroidRuntime(859): FATAL EXCEPTION: main 11-25
> 16:08:08.918: E/AndroidRuntime(859):
> java.lang.ArrayIndexOutOfBoundsException 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:4540)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.ListView.measureHeightOfChildren(ListView.java:1228)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.ListView.onMeasure(ListView.java:1127) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.View.measure(View.java:8313) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.View.measure(View.java:8313) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.View.measure(View.java:8313) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.View.measure(View.java:8313) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.View.measure(View.java:8313) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.view.ViewRoot.performTraversals(ViewRoot.java:839) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.os.Handler.dispatchMessage(Handler.java:99) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> android.os.Looper.loop(Looper.java:123) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> android.app.ActivityThread.main(ActivityThread.java:3683) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> java.lang.reflect.Method.invokeNative(Native Method) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> java.lang.reflect.Method.invoke(Method.java:507) 11-25 16:08:08.918:
> E/AndroidRuntime(859): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
> 11-25 16:08:08.918: E/AndroidRuntime(859): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 11-25
> 16:08:08.918: E/AndroidRuntime(859): at
> dalvik.system.NativeStart.main(Native Method) 11-25 16:08:09.277:
> D/dalvikvm(859): GC_CONCURRENT freed 519K, 38% free 5281K/8455K,
> external 547K/1046K, paused 8ms+19ms 11-25 16:08:09.517:
> I/dalvikvm(859): Jit: resizing JitTable from 1024 to 2048
答案 0 :(得分:1)
崩溃的原因非常明显。
当你到达List中的某个点时,你实际上没有数据要填充并显示在List中。这就是为什么当你到达你的适配器没有数据的点时,列表实际上不知道要显示什么并且崩溃强制关闭你的申请。
检查适配器并确保列表中有足够的数据。