changes crash fixed

This commit is contained in:
Gavriil Sitnikov 2016-06-02 23:14:36 +03:00
parent 908e9759a0
commit 7ff2fbde4b
2 changed files with 48 additions and 23 deletions

View File

@ -31,11 +31,9 @@ public class Change {
@NonNull final Collection modifiedCollection) {
final Collection<Change> result = new ArrayList<>();
int bufferSize = modifiedCollection.size() - initialCollection.size();
int couldBeAdded = modifiedCollection.size() - initialCollection.size();
int initialOffset = 0;
int itemsToAdd = 0;
int changedItems = 0;
int currentSize = 0;
for (final Object modifiedObject : modifiedCollection) {
boolean found = false;
@ -47,28 +45,31 @@ public class Change {
}
if (modifiedObject.equals(initialObject)) {
if (itemsToAdd > 0) {
if (bufferSize > 0) {
result.add(new Change(Type.INSERTED, currentSize, itemsToAdd - Math.abs(bufferSize - itemsToAdd)));
currentSize += itemsToAdd;
if (couldBeAdded < itemsToAdd) {
result.add(new Change(Type.CHANGED, currentSize, modifiedCollection.size() - currentSize));
final int overSize = initialCollection.size() - modifiedCollection.size();
if (overSize > 0) {
result.add(new Change(Type.REMOVED, modifiedCollection.size(), overSize));
}
return result;
}
if (bufferSize < itemsToAdd) {
int changed = Math.abs(bufferSize - itemsToAdd);
result.add(new Change(Type.CHANGED, currentSize, changed));
changedItems += changed;
bufferSize = Math.min(bufferSize, 0);
} else {
bufferSize -= itemsToAdd;
}
currentSize += itemsToAdd;
result.add(new Change(Type.INSERTED, currentSize, itemsToAdd));
couldBeAdded -= itemsToAdd;
itemsToAdd = 0;
}
found = true;
final int removeCount = initialPosition - initialOffset;
if (removeCount > 0) {
if (changedItems > 0) {
final int itemsToRemove = initialPosition - initialOffset;
if (itemsToRemove > 0) {
if (couldBeAdded < -itemsToRemove) {
result.add(new Change(Type.CHANGED, currentSize, modifiedCollection.size() - currentSize));
final int overSize = initialCollection.size() - modifiedCollection.size();
if (overSize > 0) {
result.add(new Change(Type.REMOVED, modifiedCollection.size(), overSize));
}
return result;
}
result.add(new Change(Change.Type.REMOVED, currentSize, removeCount));
result.add(new Change(Change.Type.REMOVED, currentSize, itemsToRemove));
couldBeAdded += itemsToRemove;
}
initialOffset = initialPosition + 1;
currentSize++;
@ -82,11 +83,29 @@ public class Change {
}
if (itemsToAdd > 0) {
if (couldBeAdded < itemsToAdd) {
result.add(new Change(Type.CHANGED, currentSize, modifiedCollection.size() - currentSize));
final int overSize = initialCollection.size() - modifiedCollection.size();
if (overSize > 0) {
result.add(new Change(Type.REMOVED, modifiedCollection.size(), overSize));
}
return result;
}
result.add(new Change(Type.INSERTED, currentSize, itemsToAdd));
currentSize += itemsToAdd;
couldBeAdded -= itemsToAdd;
}
if (initialCollection.size() > currentSize) {
final int itemsToRemove = initialCollection.size() - currentSize;
if (itemsToRemove > 0) {
if (couldBeAdded < -itemsToRemove) {
result.add(new Change(Type.CHANGED, currentSize, modifiedCollection.size() - currentSize));
final int overSize = initialCollection.size() - modifiedCollection.size();
if (overSize > 0) {
result.add(new Change(Type.REMOVED, modifiedCollection.size(), overSize));
}
return result;
}
result.add(new Change(Change.Type.REMOVED, currentSize, initialCollection.size() - currentSize));
}
@ -117,6 +136,11 @@ public class Change {
return count;
}
@Override
public String toString() {
return type + " change of " + start + ":" + count;
}
public enum Type {
INSERTED,
CHANGED,

View File

@ -68,9 +68,10 @@ public class ObservableFilteredList<TItem> extends ObservableCollection<TItem> {
private void updateCollections() {
if (sourceCollection == null) {
if (filteredList != null) {
notifyAboutChange(new Change(Change.Type.REMOVED, 0, filteredList.size()));
final int itemsToRemove = filteredList.size();
filteredList = null;
notifyAboutChange(new Change(Change.Type.REMOVED, 0, itemsToRemove));
}
filteredList = null;
return;
}
final List<TItem> oldFilteredList = filteredList;