remove data by card

This commit is contained in:
longerian
2018-01-18 11:40:02 +08:00
parent 0be264ef70
commit 3ef511f63f
3 changed files with 80 additions and 3 deletions
@@ -28,6 +28,7 @@ import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.text.TextUtils;
import android.util.Pair;
import android.view.View;
@@ -601,7 +602,34 @@ public class TangramEngine extends BaseTangramEngine<JSONArray, Card, BaseCell>
* @param group
*/
public void removeComponents(Card group) {
VirtualLayoutManager layoutManager = getLayoutManager();
if (group != null && mGroupBasicAdapter != null && layoutManager != null) {
int cardIdx = mGroupBasicAdapter.findCardIdxForCard(group);
List<LayoutHelper> layoutHelpers = layoutManager.getLayoutHelpers();
LayoutHelper emptyLayoutHelper = null;
int removeItemCount = 0;
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 (i < cardIdx) {
// do nothing
} else if (i == cardIdx) {
removeItemCount = layoutHelper.getItemCount();
emptyLayoutHelper = layoutHelper;
} else {
layoutHelper.setRange(start - removeItemCount, end - removeItemCount);
}
}
if (emptyLayoutHelper != null) {
final List<LayoutHelper> newLayoutHelpers = new LinkedList<>(layoutHelpers);
newLayoutHelpers.remove(emptyLayoutHelper);
layoutManager.setLayoutHelpers(newLayoutHelpers, false);
}
mGroupBasicAdapter.removeComponents(group);
}
}
}
}
@@ -306,7 +306,7 @@ public abstract class GroupBasicAdapter<L, C> extends VirtualLayoutAdapter<Binde
/**
*
* @param card
* @return card ragne of given instance
* @return card range of given instance
*/
public Range<Integer> getCardRange(Card card) {
if (card == null) return Range.create(0, 1);
@@ -319,6 +319,20 @@ public abstract class GroupBasicAdapter<L, C> extends VirtualLayoutAdapter<Binde
}
}
/**
*
* @param card
* @return card index of given instance
*/
public int findCardIdxForCard(L card) {
for (int i = 0, size = mCards.size(); i < size; i++) {
if (mCards.get(i).second == card) {
return i;
}
}
return -1;
}
/**
*
* @param position cell's adapter position
@@ -536,6 +550,12 @@ public abstract class GroupBasicAdapter<L, C> extends VirtualLayoutAdapter<Binde
*/
abstract public void removeComponent(C component);
/**
*
* @param group a group of components to be removed.
*/
abstract public void removeComponents(L group);
/**
* Do not call this method directly. It's not designed for users.
* @param pos
@@ -418,11 +418,40 @@ public class PojoGroupBasicAdapter extends GroupBasicAdapter<Card, BaseCell> {
mCards.clear();
mCards.addAll(newCards);
mData.remove(component);
notifyItemRemoved(removePosition);
notifyItemRangeChanged(removePosition, 1);
}
}
}
@Override
public void removeComponents(Card group) {
if (group != null && mCards != null) {
List<Pair<Range<Integer>, Card>> newCards = new ArrayList<>();
int cardIdx = findCardIdxForCard(group);
int removeItemCount = 0;
int removePosition = 0;
for (int i = 0, size = mCards.size(); i < size; i++) {
Pair<Range<Integer>, Card> pair = mCards.get(i);
int start = pair.first.getLower();
int end = pair.first.getUpper();
if (i < cardIdx) {
//do nothing
newCards.add(pair);
} else if (i == cardIdx) {
removePosition = start;
removeItemCount = end - start;
} else {
Pair<Range<Integer>, Card> newPair = new Pair<>(Range.create(start - removeItemCount, end - removeItemCount), pair.second);
newCards.add(newPair);
}
}
mCards.clear();
mCards.addAll(newCards);
mData.removeAll(group.getCells());
notifyItemRangeRemoved(removePosition, removeItemCount);
}
}
@Override
public void insertComponents(int pos, List<BaseCell> components) {
if (mData != null && components != null && !components.isEmpty() && pos > 0) {