2011-10-27 75 views
0

使用Sectioned adapter即时通讯。每个部分都有一个“subAdapter”。当在列表视图中更新适配器时崩溃

当我删除所有部分并添加新部分时,出现问题。如果新的金额>旧金额的部分。

10-27 08:08:33.789: ERROR/AndroidRuntime(21550): java.lang.ArrayIndexOutOfBoundsException 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:5283) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4092) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:2523) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.ListView.onTouchEvent(ListView.java:3733) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.View.dispatchTouchEvent(View.java:3885) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 

从我读过的这是一个getViewTypeCount的问题。我猜测,当我更新适配器并调用adapter.notifyDataSetChanged()时,该方法未被调用;

如果我将适配器的新实例设置为listAdapter,则不会发生此问题。

我该如何解决这个问题?我可以强制活动回忆getViewTypeCount吗?

+0

请添加代码从您的适配器。 –

回答

2

我猜测当我更新适配器并调用adapter.notifyDataSetChanged()时,该方法未被调用;

正确。 getViewTypeCount()只被调用一次。

我该如何解决这个问题?

不要在适配器的生命周期中更改getViewTypeCount()的值。

我可以强制该活动调用getViewTypeCount吗?

不是说我知道,对不起。

+0

从javadoc'只有在适配器设置在AdapterView'上时才会调用此方法 – Blundell

0

哈克警报

如果您正在使用的Etsy的StaggerredGridView(和复制代码作为一个模块),或使用extends AbsListView你能得到它召回getViewTypeCount()每当调用notifyDataSetChanged()东西。

这里是原来的代码(StaggeredGridView - ExtendableListView.java

@Override 
public void setAdapter(final ListAdapter adapter) { 
    // ... other code 

    if (mAdapter != null) { 
     mAdapter.registerDataSetObserver(mObserver); 
     mRecycleBin.setViewTypeCount(mAdapter.getViewTypeCount()); 
    } 

    requestLayout(); 
} 

正如你可以看到mAdapter.getViewTypeCount()当你调用setAdapter只叫 因此,如果我们复制此代码并将其移动到的地方notifyDataSetChanged()是叫我们可以使用新类型的更新我们的适配器

这是在这里(用于StaggeredGridView - ExtendableListView.java

class AdapterDataSetObserver extends DataSetObserver { 

     private Parcelable mInstanceState = null; 

     @Override 
     public void onChanged() { 
      // other code 

      mRecycleBin.clearTransientStateViews(); 
      mRecycleBin.setViewTypeCount(mAdapter.getViewTypeCount()); // ADD THIS 

      // other code 
      requestLayout(); 
     } 

     // more methods 
    } 

我不知道这是否会影响性能或回收,通过阅读本文,您将承担上述代码的所有责任。 :-)