问题
Adapter的数据自己要用于getView和getCount,而且程序是getCount后在不同方法里面连续getView,这带来个问题:getCount后,数据被其他线程删除,在getView的时候越界
解决思路
- 建立一个ConcurrentAdapter,里面用两个List存储数据,一个是外部操作增删用,一个用来实际绘制用。
- 当外部增删后,暂时不改变内部的List,这样就不会出现越界
- 当内部再次getCount后,如果发现外部修改了List,就重新从外部Copy一次。
代码
public class ConcurrentAdapter<T> {
//用于外部操作的List,外部对其增删
private List<T> objectsCached=new ArrayList<T>();
//用于Adapter内部计算用,从外部Copy过来
private List<T> objects=new ArrayList<T>();
//用于缓存List的数量,当-1的时候,表示外部修改过List,需要更新
private int count=-1;
public int getCount(){
if(count==-1){
synchronized (objectsCached){
objects.clear();
objects.addAll(objectsCached);
count=objects.size();
return count;
}
}else{
return count;
}
}
public T getObject(int position){
return objects.get(position);
}
public void addObject(T object){
synchronized (objectsCached){
objectsCached.add(object);
count=-1;
}
}
public void addObjects(List<T> objects){
synchronized (objectsCached){
objectsCached.addAll(objects);
count=-1;
}
}
public void setObjects(List<T> objects){
synchronized (objectsCached){
objectsCached.clear();
objectsCached.addAll(objects);
count=-1;
}
}
public void removeObject(T object){
synchronized (objectsCached){
objectsCached.remove(object);
count=-1;
}
}
}