+ private ArrayList<TemplateDetailsItem> copyItems() {
+ List<TemplateDetailsItem> oldList = items.getValue();
+
+ if (oldList == null)
+ return new ArrayList<>();
+
+ ArrayList<TemplateDetailsItem> result = new ArrayList<>(oldList.size());
+
+ for (TemplateDetailsItem item : oldList) {
+ if (item instanceof TemplateDetailsItem.Header)
+ result.add(new TemplateDetailsItem.Header(item.asHeaderItem()));
+ else if (item instanceof TemplateDetailsItem.AccountRow)
+ result.add(new TemplateDetailsItem.AccountRow(item.asAccountRowItem()));
+ else
+ throw new RuntimeException("Unexpected item " + item);
+ }
+
+ return result;
+ }
+ public void moveItem(int sourcePos, int targetPos) {
+ final List<TemplateDetailsItem> newList = copyItems();
+
+ if (BuildConfig.DEBUG) {
+ Logger.debug("drag", "Before move:");
+ for (int i = 1; i < newList.size(); i++) {
+ final TemplateDetailsItem item = newList.get(i);
+ Logger.debug("drag",
+ String.format(Locale.US, " %d: id %d, pos %d", i, item.getId(),
+ item.getPosition()));
+ }
+ }
+
+ {
+ TemplateDetailsItem item = newList.remove(sourcePos);
+ newList.add(targetPos, item);
+ }
+
+ // adjust affected items' positions
+ {
+ int startPos, endPos;
+ if (sourcePos < targetPos) {
+ // moved down
+ startPos = sourcePos;
+ endPos = targetPos;
+ }
+ else {
+ // moved up
+ startPos = targetPos;
+ endPos = sourcePos;
+ }
+
+ for (int i = startPos; i <= endPos; i++) {
+ newList.get(i)
+ .setPosition(i);
+ }
+ }
+
+ if (BuildConfig.DEBUG) {
+ Logger.debug("drag", "After move:");
+ for (int i = 1; i < newList.size(); i++) {
+ final TemplateDetailsItem item = newList.get(i);
+ Logger.debug("drag",
+ String.format(Locale.US, " %d: id %d, pos %d", i, item.getId(),
+ item.getPosition()));
+ }
+ }
+
+ items.setValue(newList);
+ }
+ public void removeItem(int position) {
+ Logger.debug(TAG, "Removing item at position " + position);
+ ArrayList<TemplateDetailsItem> newList = copyItems();
+ newList.remove(position);
+ for (int i = position; i < newList.size(); i++)
+ newList.get(i)
+ .setPosition(i);
+ applyList(newList);
+ }