/**
* Add a scrap ViewHolder to the pool.
* <p>
* If the pool is already full for that ViewHolder's type, it will be immediately discarded.
*
* @param scrap ViewHolder to be added to the pool.
*/
public void putRecycledView(ViewHolder scrap) {
final int viewType = scrap.getItemViewType();
final ArrayList<ViewHolder> scrapHeap = getScrapDataForType(viewType).mScrapHeap;
//如果缓存池大于等于最大可缓存数,则返回
if (mScrap.get(viewType).mMaxScrap <= scrapHeap.size()) {
return;
}
if (DEBUG && scrapHeap.contains(scrap)) {
throw new IllegalArgumentException("this scrap item already exists");
}
scrap.resetInternal();
scrapHeap.add(scrap);
}
/**
* Add a scrap ViewHolder to the pool.
* <p>
* If the pool is already full for that ViewHolder's type, it will be immediately discarded.
*
* @param scrap ViewHolder to be added to the pool.
*/
public void putRecycledView(ViewHolder scrap) {
final int viewType = scrap.getItemViewType();
final ArrayList<ViewHolder> scrapHeap = getScrapDataForType(viewType).mScrapHeap;
//如果缓存池大于等于最大可缓存数,则返回
if (mScrap.get(viewType).mMaxScrap <= scrapHeap.size()) {
return;
}
if (DEBUG && scrapHeap.contains(scrap)) {
throw new IllegalArgumentException("this scrap item already exists");
}
scrap.resetInternal();
scrapHeap.add(scrap);
}
DiffUtil 使用 Eugene W. Myers 的差分算法来计算将一个列表转换为另一个列表的最少更新次数。但是对比数据时也会耗时,所以也可以采用 AsyncListDiffer 类,把对比操作放在异步线程中执行。
在使用 DiffUtil 中我们发现,要对比的数据项太多了,为了解决这个问题,我们对数据源进行了封装,在数据源里添加了一个表示是否更新的字段,把所有变量改为 private 类型,并且提供 set 方法,在 set 方法中统一将是否更新的字段设置为 true。这样在进行两组数据对比时,我们只需要判断该字段是否为 true,就知道是否存在更新。
想法是美好的,但是在实际封装数据源时发现,类中还有类(也就是类中有对象,不是基本数据类型),外部完全可以通过先 get 到一个对象,然后通过改对象的引用修改其中的字段,这样就跳过了 set 方法。如果要解决这个问题,那么我们需要在封装类中提供类中类属性的所有 set 方法,并且不提供类中类的 get 方法,改动非常的大。