我在這裏有一個真正麻煩的問題,我現在遇到的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;
}
}
你有與ArrayList的工作的線程? – nKn
不,這也是奇怪的事情,這不使用任何線程。 –
ConcurrenttModificationException並不特別適用於多線程應用程序。這個異常甚至可能發生在單線程應用程序中,這一切都取決於迭代器底層的集合是如何被操縱的 – sadhu