package com.airbnb.epoxy; import android.support.v7.widget.RecyclerView.AdapterDataObserver; import java.util.ArrayList; import java.util.List; class TestObserver extends AdapterDataObserver { List<TestModel> modelsAfterDiffing = new ArrayList<>(); List<TestModel> initialModels = new ArrayList<>(); int operationCount = 0; private boolean showLogs; TestObserver(boolean showLogs) { this.showLogs = showLogs; } TestObserver() { this(false); } void setUpForNextDiff(List<TestModel> models) { initialModels = new ArrayList<>(models); modelsAfterDiffing = new ArrayList<>(models); } @Override public void onItemRangeChanged(int positionStart, int itemCount) { if (showLogs) { System.out.println("Item range changed. Start: " + positionStart + " Count: " + itemCount); } for (int i = positionStart; i < positionStart + itemCount; i++) { modelsAfterDiffing.get(i).updated = true; } operationCount++; } @Override public void onItemRangeInserted(int positionStart, int itemCount) { if (showLogs) { System.out.println("Item range inserted. Start: " + positionStart + " Count: " + itemCount); } List<TestModel> modelsToAdd = new ArrayList<>(itemCount); for (int i = 0; i < itemCount; i++) { modelsToAdd.add(InsertedModel.INSTANCE); } modelsAfterDiffing.addAll(positionStart, modelsToAdd); operationCount++; } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { if (showLogs) { System.out.println("Item range removed. Start: " + positionStart + " Count: " + itemCount); } modelsAfterDiffing.subList(positionStart, positionStart + itemCount).clear(); operationCount++; } @Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { if (showLogs) { System.out.println("Item moved. From: " + fromPosition + " To: " + toPosition); } TestModel itemToMove = modelsAfterDiffing.remove(fromPosition); modelsAfterDiffing.add(toPosition, itemToMove); operationCount++; } }