問題:
Adapter的數(shù)據(jù)自己要用于getView和getCount,而且程序是getCount后在不同方法里面連續(xù)getView,這帶來個問題:getCount后,數(shù)據(jù)被其他線程刪除,在getView的時候越界。
解決思路:
1、建立一個ConcurrentAdapter,里面用兩個List存儲數(shù)據(jù),一個是外部操作增刪用,一個用來實際繪制用。
2、當外部增刪后,暫時不改變內(nèi)部的List,這樣就不會出現(xiàn)越界
3、當內(nèi)部再次getCount后,如果發(fā)現(xiàn)外部修改了List,就重新從外部Copy一次
代碼:
publicclassConcurrentAdapter{
//用于外部操作的List,外部對其增刪
privateListobjectsCached=newArrayList();
//用于Adapter內(nèi)部計算用,從外部Copy過來
privateListobjects=newArrayList();
//用于緩存List的數(shù)量,當-1的時候,表示外部修改過List,需要更新
privateintcount=-1;
publicintgetCount(){
if(count==-1){
synchronized(objectsCached){
objects.clear();
objects.addAll(objectsCached);
count=objects.size();
returncount;
}
}else{
returncount;
}
}
publicT getObject(intposition){
returnobjects.get(position);
}
publicvoidaddObject(T object){
synchronized(objectsCached){
objectsCached.add(object);
count=-1;
}
}
publicvoidaddObjects(Listobjects){
synchronized(objectsCached){
objectsCached.addAll(objects);
count=-1;
}
}
publicvoidsetObjects(Listobjects){
synchronized(objectsCached){
objectsCached.clear();
objectsCached.addAll(objects);
count=-1;
}
}
publicvoidremoveObject(T object){
synchronized(objectsCached){
objectsCached.remove(object);
count=-1;
}
}
}