2011-11-25 98 views
2

大家好我是Android编程的初学者,也是新鲜开发者,在我的android项目中,我在下面的场景中得到了一个问题,
我有一些列表巨大的项目,这个列表有滚动条,当开始滚动列表中间的特定点的程序崩溃,并要求强制关闭.. logcat说这是由于ArrayIndexOutOfBounds异常,我不知道应该做什么修改此..任何机构请帮助我,如果是已知的问题..Android列表视图滚动问题

我的代码..

@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 snippet ...

> 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

您正在以错误的方式使用[getViewTypeCount()](http://developer.android.com/reference/android/widget/Adapter.html#getViewTypeCount())。 –

回答

1

你的崩溃的原因很明显。

当你到达列表中的某一点,你居然没有数据来填充和显示在您的List.That。这就是为什么当你到达那里适配器没有数据列表实际上完全不认识显示什么和崩溃力点关闭你的应用。

检查您的适配器,并确保您有足够的数据列表。

+0

谢谢Serdar的支持,适配器类有足够的数据..名单是巨大的。在特定点说,当它穿过50个项目意外滚动崩溃..我需要任何特定的修改滚动.. – user1065490

+0

如果您的适配器有足够的数据,你仍然得到这样的空崩溃意味着你填充列表的方式和还有你通过适配器迭代的方式有点不对,导致问题。你最好检查你的逻辑队友。 –

+0

它是由某人开发的,我只需要解决这个问题。而且我也是初学者,因此在启动时面对小缺陷。 – user1065490