From 5e232f27c5ef3c83c8a45529a765234256624e44 Mon Sep 17 00:00:00 2001 From: longerian Date: Tue, 16 Jan 2018 20:44:32 +0800 Subject: [PATCH] add insertComponents API at TangramEngine --- .../wireless/tangram/BaseTangramEngine.java | 14 ++++---- .../tmall/wireless/tangram/TangramEngine.java | 35 ++++++++++++++++++- .../core/adapter/GroupBasicAdapter.java | 9 +++-- .../concrete/PojoGroupBasicAdapter.java | 18 +++++----- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/tangram/src/main/java/com/tmall/wireless/tangram/BaseTangramEngine.java b/tangram/src/main/java/com/tmall/wireless/tangram/BaseTangramEngine.java index ddc7e8d..176a3a8 100644 --- a/tangram/src/main/java/com/tmall/wireless/tangram/BaseTangramEngine.java +++ b/tangram/src/main/java/com/tmall/wireless/tangram/BaseTangramEngine.java @@ -299,7 +299,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Insert original data to Tangram at target position. + * Insert original data to Tangram at target position. This method will introduce page reload by notifyDataSetChanged(). * @param position Target insert position. * @param data Original data with type {@link T}. */ @@ -310,7 +310,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Replace original data to Tangram at target position + * Replace original data to Tangram at target position. This method will introduce page reload by notifyDataSetChanged(). * @param position Target insert position. * @param data Original data with type {@link T}. */ @@ -333,7 +333,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Append parsed data list with type {@link C} in Tangram + * Append parsed data list with type {@link C} in Tangram. This method will introduce page reload by notifyDataSetChanged(). * @param data Parsed data list. */ public void appendData(@Nullable List data) { @@ -342,7 +342,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Insert parsed data to Tangram at target position + * Insert parsed data to Tangram at target position. This method will introduce page reload by notifyDataSetChanged(). * @param position Target insert position. * @param data Parsed data list. */ @@ -352,7 +352,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Replace original data to Tangram at target position + * Replace original data to Tangram at target position. This method will introduce page reload by notifyDataSetChanged(). * @param position Target replace position. * @param data Parsed data list. */ @@ -362,7 +362,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Remove a card at target card position + * Remove a card at target card position. This method will introduce page reload by notifyDataSetChanged(). * @param position the position of card in group */ public void removeData(int position) { @@ -371,7 +371,7 @@ public class BaseTangramEngine implements ServiceManager { } /** - * Remove the target card from list + * Remove the target card from list. This method will introduce page reload by notifyDataSetChanged(). * @param data Target card */ public void removeData(C data) { diff --git a/tangram/src/main/java/com/tmall/wireless/tangram/TangramEngine.java b/tangram/src/main/java/com/tmall/wireless/tangram/TangramEngine.java index cc3d38e..ffcc348 100644 --- a/tangram/src/main/java/com/tmall/wireless/tangram/TangramEngine.java +++ b/tangram/src/main/java/com/tmall/wireless/tangram/TangramEngine.java @@ -31,8 +31,8 @@ import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Pair; import android.view.View; -import android.widget.ImageView; +import com.alibaba.android.vlayout.LayoutHelper; import com.alibaba.android.vlayout.Range; import com.alibaba.android.vlayout.VirtualLayoutManager; import com.tmall.wireless.tangram.dataparser.DataParser; @@ -497,4 +497,37 @@ public class TangramEngine extends BaseTangramEngine } return null; } + + /** + * A high performance method to insert cells. TODO handle nested card + * @param insertPosition the position to be inserted, note that new data will start from position + 1 + * @param data new cell data list + */ + public void insertComponents(int insertPosition, List data) { + int newItemSize = data != null ? data.size() : 0; + if (newItemSize > 0) { + BaseCell insertCell = mGroupBasicAdapter.getItemByPosition(insertPosition); + int cardIdx = mGroupBasicAdapter.findCardIdxFor(insertPosition); + Card card = mGroupBasicAdapter.getCardRange(cardIdx).second; + card.addCells(card, card.getCells().indexOf(insertCell) + 1, data); + List layoutHelpers = getLayoutManager().getLayoutHelpers(); + if (layoutHelpers != null && cardIdx >= 0 && cardIdx < layoutHelpers.size()) { + for (int i = 0, size = layoutHelpers.size(); i < size; i++) { + LayoutHelper layoutHelper = layoutHelpers.get(i); + int start = layoutHelper.getRange().getLower(); + int end = layoutHelper.getRange().getUpper(); + if (end < insertPosition) { + //do nothing + } else if (start <= insertPosition && insertPosition <= end) { + layoutHelper.setItemCount(layoutHelper.getItemCount() + newItemSize); + layoutHelper.setRange(start, end + newItemSize); + } else if (insertPosition < start) { + layoutHelper.setRange(start + newItemSize, end + newItemSize); + } + } + mGroupBasicAdapter.insertComponents(insertPosition, data); + } + } + } + } \ No newline at end of file diff --git a/tangram/src/main/java/com/tmall/wireless/tangram/core/adapter/GroupBasicAdapter.java b/tangram/src/main/java/com/tmall/wireless/tangram/core/adapter/GroupBasicAdapter.java index 8aaf33b..bcc20d8 100644 --- a/tangram/src/main/java/com/tmall/wireless/tangram/core/adapter/GroupBasicAdapter.java +++ b/tangram/src/main/java/com/tmall/wireless/tangram/core/adapter/GroupBasicAdapter.java @@ -525,17 +525,22 @@ public abstract class GroupBasicAdapter extends VirtualLayoutAdapter components); /** diff --git a/tangram/src/main/java/com/tmall/wireless/tangram/dataparser/concrete/PojoGroupBasicAdapter.java b/tangram/src/main/java/com/tmall/wireless/tangram/dataparser/concrete/PojoGroupBasicAdapter.java index 8b1ba48..bffc775 100644 --- a/tangram/src/main/java/com/tmall/wireless/tangram/dataparser/concrete/PojoGroupBasicAdapter.java +++ b/tangram/src/main/java/com/tmall/wireless/tangram/dataparser/concrete/PojoGroupBasicAdapter.java @@ -425,18 +425,17 @@ public class PojoGroupBasicAdapter extends GroupBasicAdapter { int newItemSize = components.size(); if (mCards != null) { List, Card>> newCards = new ArrayList<>(); - int clickPos = pos -1; for (int i = 0, size = mCards.size(); i < size; i++) { Pair, Card> pair = mCards.get(i); - int start = pair.first.getLower().intValue(); - int end = pair.first.getUpper().intValue(); - if (end < clickPos) { + int start = pair.first.getLower(); + int end = pair.first.getUpper(); + if (end < pos) { //do nothing newCards.add(pair); - } else if (start <= clickPos && clickPos <= end) { + } else if (start <= pos && pos <= end) { Pair, Card> newPair = new Pair<>(Range.create(start, end + newItemSize), pair.second); newCards.add(newPair); - } else if (clickPos < start) { + } else if (pos < start) { Pair, Card> newPair = new Pair<>(Range.create(start + newItemSize, end + newItemSize), pair.second); newCards.add(newPair); } @@ -444,14 +443,15 @@ public class PojoGroupBasicAdapter extends GroupBasicAdapter { mCards.clear(); mCards.addAll(newCards); } + int insertPosition = pos + 1; for (int i = 0; i < newItemSize; i++) { - if ((pos + i) < mData.size()) { - mData.add(pos + i, components.get(i)); + if ((insertPosition + i) < mData.size()) { + mData.add(insertPosition + i, components.get(i)); } else { mData.add(components.get(i)); } } - notifyItemRangeInserted(pos, newItemSize); + notifyItemRangeInserted(pos + 1, newItemSize); } }