// Copyright 2004-present Facebook. All Rights Reserved. package com.facebook.litho.widget; import java.util.ArrayList; import java.util.List; import com.facebook.litho.ComponentInfo; import com.facebook.litho.widget.RecyclerBinderUpdateCallback.ComponentContainer; import com.facebook.litho.widget.RecyclerBinderUpdateCallback.Operation; import com.facebook.litho.widget.RecyclerBinderUpdateCallback.OperationExecutor; /** * An implementation of {@link OperationExecutor} that uses {@link RecyclerBinder}. */ public class RecyclerBinderOperationExecutor implements OperationExecutor { private final RecyclerBinder mRecyclerBinder; public RecyclerBinderOperationExecutor(RecyclerBinder recyclerBinder) { mRecyclerBinder = recyclerBinder; } @Override public void executeOperations(List<Operation> operations) { for (int i = 0, size = operations.size(); i < size; i++) { final Operation operation = operations.get(i); final List<ComponentContainer> components = operation.getComponentContainers(); List<ComponentInfo> componentInfos = null; if (components != null && components.size() > 1 ) { componentInfos = new ArrayList<>(); for (int j = 0, componentsSize = components.size(); j < componentsSize; j++) { componentInfos.add(components.get(j).getComponentInfo()); } } switch (operation.getType()) { case Operation.INSERT: if (componentInfos != null) { mRecyclerBinder.insertRangeAt(operation.getIndex(), componentInfos); } else { mRecyclerBinder.insertItemAt( operation.getIndex(), operation.getComponentContainers().get(0).getComponentInfo()); } break; case Operation.DELETE: mRecyclerBinder.removeRangeAt(operation.getIndex(), operation.getToIndex()); break; case Operation.MOVE: mRecyclerBinder.moveItem(operation.getIndex(), operation.getToIndex()); break; case Operation.UPDATE: if (componentInfos != null) { mRecyclerBinder.updateRangeAt(operation.getIndex(), componentInfos); } else { mRecyclerBinder.updateItemAt( operation.getIndex(), operation.getComponentContainers().get(0).getComponentInfo()); } break; } } } }