2014-01-29 19 views
0

我在這裏有一個真正麻煩的問題,我現在遇到的ArrayAdapter.add(對象o)方法ConcurrentModificationException的。實際上,stacktrace指向ArrayAdapter中的list.size()方法。但由於我甚至沒有重複列表,所以這是非常不尋常的。下面是崩潰的代碼的代碼片段:ConcurrentModificationException的在ArrayAdapter添加方法

private void addCharacterToPager(Character savedChar) { 
     RelativeLayout lastGrid = pagerAdapter.retrieveViews().get(
       pagerAdapter.getCount() - 1); 
     // get gridview 
     GridView lastGridView = (GridView) lastGrid.getChildAt(lastGrid 
       .getChildCount() - 1); 
     CharacterGridAdapter adapter = (CharacterGridAdapter) lastGridView 
       .getAdapter(); 


     adapter.add(savedChar); 
     adapter.notifyDataSetChanged(); 
     pagerAdapter.retrieveViews().set(pagerAdapter.getCount(), lastGrid); 
     pagerAdapter.notifyDataSetChanged(); 

    } 

這是我的自定義ArrayAdapter:

public class CharacterGridAdapter extends ArrayAdapter<Character> { 

private Context context; 
private List<Character> objects; 
private int resource; 

public CharacterGridAdapter(Context context, int resource, 
     List<Character> listChar) { 
    super(context, resource, listChar); 
    this.context = context; 
    this.resource = resource; 
    this.objects = listChar; 
} 

public void updateCollection(List<Character> listChar) { 
    this.objects = listChar; 
} 

public List<Character> retrieveCollection() { 
    return this.objects; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    ImageView charImg = null; 
    if (rowView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.charactergrid_cell, null); 
     charImg = (ImageView) rowView 
       .findViewById(R.id.characterImage_cell); 
    } else { 
     charImg = (ImageView) convertView 
       .findViewById(R.id.characterImage_cell); 
    } 

    Character currentChar = objects.get(position); 

    if (currentChar.getName().equals("add") 
      && currentChar.getGame().equals("add")) { 
     //set charimg to add icon 
     charImg.setImageResource(R.drawable.add); 
    } else { 
     if(currentChar.getCharacterImage() != null) { 
      //set charimg to url 
      Picasso.with(context).load(currentChar.getCharacterImage().getUrl()).into(charImg); 
     } else { 
      //set charimg to default 
     } 
    } 

    return rowView; 
} 

} 

這是堆棧跟蹤:

01-29 12:58:12.666: E/AndroidRuntime(18891):at java.util.ConcurrentModificationException 
01-29 12:58:12.666: E/AndroidRuntime(18891):at java.util.AbstractList$SubAbstractList.size(AbstractList.java:360) 
01-29 12:58:12.666: E/AndroidRuntime(18891):at java.util.AbstractList.add(AbstractList.java:425) 
01-29 12:58:12.666: E/AndroidRuntime(18891):at android.widget.ArrayAdapter.add(ArrayAdapter.java:179) 
01-29 12:58:12.666: E/AndroidRuntime(18891):at com.xx.playpalproject.ProfileActivity$SaveCharacter.addCharacterToPager(ProfileActivity.java:648) 

我真的不明白的問題,所有我想要做的就是將項目添加到適配器..

更新

我解決了這個問題初始,我將項目添加到我執行addCharacterToPager方法之前適配器設置爲集合。 但是這真的沒有解決它。現在我得到了完全相同的錯誤,但嘗試修改pagerAdapter集合並通知其數據已更改。因此,原來的問題仍然存在,只是它移到它已移動到另一個適配器..

更新2

,而不是試圖添加一個項目,我試圖重建整個ViewPager和我的驚喜呢也給了我一個ConcurrentModificationException。這次它被拋出在ArrayAdapter的getCount()方法中,但我不知道這是否實際上是我的自定義適配器。這裏的堆棧跟蹤:

01-29 14:26:56.036: E/AndroidRuntime(23898): FATAL EXCEPTION: main 
01-29 14:26:56.036: E/AndroidRuntime(23898): java.util.ConcurrentModificationException 
01-29 14:26:56.036: E/AndroidRuntime(23898): at java.util.AbstractList$SubAbstractList.size(AbstractList.java:360) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.widget.AbsListView.onAttachedToWindow(AbsListView.java:2642) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.View.dispatchAttachedToWindow(View.java:11983) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2495) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2502) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.addViewInner(ViewGroup.java:3469) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.addView(ViewGroup.java:3301) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.support.v4.view.ViewPager.addView(ViewPager.java:1304) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.addView(ViewGroup.java:3246) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.view.ViewGroup.addView(ViewGroup.java:3222) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at com.timkranen.adapters.CustomPagerAdapter.instantiateItem(CustomPagerAdapter.java:22) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.support.v4.view.ViewPager.populate(ViewPager.java:982) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:442) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at com.xx.playpalproject.ProfileActivity.setupCharacterGrid(ProfileActivity.java:175) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at com.xx.playpalproject.ProfileActivity.access$8(ProfileActivity.java:166) 
01-29 14:26:56.036: E/AndroidRuntime(23898): at com.xx.playpalproject.ProfileActivity$SaveCharacter.done(ProfileActivity.java:638) 

setupCharacterGrid()方法:

private void setupCharacterGrid() { 
    charPager.setAdapter(null); 
    List<List<Character>> dividedLists = Lists.partition(currentCharacters, 
      9); 
    if (isOwner) { 
     dividedLists.get(0).add(0, new Character("add", "add")); 
    } 
    fillGrids(dividedLists); 
    pagerAdapter = new CustomPagerAdapter(characterGrids); 
    charPager.setAdapter(pagerAdapter); 
    charPager.setPageTransformer(true, new ZoomPagerTransformer()); 
    charPager.setCurrentItem(0); 
} 

而且fillGrids()方法:

private void fillGrids(List<List<Character>> divList) { 
    for (List<Character> list : divList) { 
     RelativeLayout rLayout = new RelativeLayout(this); 
     GridView gridView = new GridView(this); 
     gridView.setNumColumns(3); 
     gridView.setVerticalSpacing(70); 
     CharacterGridAdapter aa = new CharacterGridAdapter(this, 
       R.layout.charactergrid_cell, list); 
     gridView.setAdapter(aa); 
     gridView.setLayoutParams(genLayoutParams()); 
     gridView.setOnItemClickListener(new GridClick()); 
     rLayout.addView(gridView); 
     characterGrids.add(rLayout); 
    } 
} 

的CustomPagerAdapter:

public class CustomPagerAdapter extends PagerAdapter { 

public List<RelativeLayout> gridViews; 

public CustomPagerAdapter(List<RelativeLayout> gridViews) { 
    this.gridViews = gridViews; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    RelativeLayout gridView = gridViews.get(position); 
    container.addView(gridView); 
    return gridView; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    container.removeView(gridViews.get(position)); 
} 

@Override 
public int getCount() { 
    return gridViews.size(); 
} 

@Override 
public boolean isViewFromObject(View view, Object o) { 
    return view == o; 
} 

public List<RelativeLayout> retrieveViews() { 
    return gridViews; 
} 

public void updateCollection(List<RelativeLayout> gridViews) { 
    this.gridViews = gridViews; 
} 

}

+0

你有與ArrayList的工作的線程? – nKn

+0

不,這也是奇怪的事情,這不使用任何線程。 –

+1

ConcurrenttModificationException並不特別適用於多線程應用程序。這個異常甚至可能發生在單線程應用程序中,這一切都取決於迭代器底層的集合是如何被操縱的 – sadhu

回答

0

我認爲錯誤是在你的instantiatItem()方法。無論我看到什麼實現,此方法似乎旨在創建一個新的對象,而不是引用一個現有的。你需要使用inflater.inflate並添加此欣賞到container viewgroups。

你使用它的方式似乎是getCount()預期不同數量的元素的,比它的規定,這將有意義,如果你只是引用一個對象,而不是創建它像我上面寫的,並得出結論,它被通過幾種方法修改。嘗試創建一個新的實例,它應該工作。

+0

但是,如果我必須在instantiateItem()中創建對象,我可以從來沒有將一個集合綁定到適配器?我如何實例化多個動態項目呢? –

相關問題