Merge "Notify the correct position when removing the last item"

This commit is contained in:
Maurice Lam 2017-03-28 22:04:40 +00:00 committed by Android (Google) Code Review
commit 0fa3a152a7
2 changed files with 56 additions and 2 deletions

View file

@ -193,7 +193,8 @@ public class ItemGroup extends AbstractItemHierarchy implements ItemInflater.Ite
}
/**
* @return The "Item Position" of the given child, or -1 if the child is empty or not found.
* @return The "Item Position" of the given child, or -1 if the child is not found. If the given
* child is empty, position of the next visible item is returned.
*/
private int getChildPosition(ItemHierarchy child) {
// Check the identity of the child rather than using .equals(), because here we want
@ -204,7 +205,14 @@ public class ItemGroup extends AbstractItemHierarchy implements ItemInflater.Ite
private int getChildPosition(int childIndex) {
updateDataIfNeeded();
if (childIndex != -1) {
return mHierarchyStart.get(childIndex, -1);
int childPos = -1;
int childCount = mChildren.size();
for (int i = childIndex; childPos < 0 && i < childCount; i++) {
// Find the position of the first visible child after childIndex. This is required
// when removing the last item from a nested ItemGroup.
childPos = mHierarchyStart.get(i, -1);
}
return childPos;
}
return -1;
}

View file

@ -123,6 +123,52 @@ public class ItemGroupTest {
verifyNoMoreInteractions(mObserver);
}
@Test
public void testNestedGroupClearNotification() {
ItemGroup parentGroup = new ItemGroup();
ItemGroup childGroup = new ItemGroup();
parentGroup.registerObserver(mObserver);
parentGroup.addChild(CHILD_1);
childGroup.addChild(CHILD_2);
childGroup.addChild(CHILD_3);
parentGroup.addChild(childGroup);
parentGroup.addChild(CHILD_4);
childGroup.clear();
final InOrder inOrder = inOrder(mObserver);
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(0), eq(1));
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(1), eq(2));
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(3), eq(1));
verify(mObserver).onItemRangeRemoved(eq(parentGroup), eq(1), eq(2));
verifyNoMoreInteractions(mObserver);
}
@Test
public void testNestedGroupRemoveNotification() {
ItemGroup parentGroup = new ItemGroup();
ItemGroup childGroup = new ItemGroup();
parentGroup.registerObserver(mObserver);
parentGroup.addChild(CHILD_1);
childGroup.addChild(CHILD_2);
childGroup.addChild(CHILD_3);
parentGroup.addChild(childGroup);
parentGroup.addChild(CHILD_4);
childGroup.removeChild(CHILD_3);
childGroup.removeChild(CHILD_2);
final InOrder inOrder = inOrder(mObserver);
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(0), eq(1));
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(1), eq(2));
inOrder.verify(mObserver).onItemRangeInserted(eq(parentGroup), eq(3), eq(1));
inOrder.verify(mObserver).onItemRangeRemoved(eq(parentGroup), eq(2), eq(1));
inOrder.verify(mObserver).onItemRangeRemoved(eq(parentGroup), eq(1), eq(1));
verifyNoMoreInteractions(mObserver);
}
@Test
public void testNotifyChange() {
mItemGroup.addChild(CHILD_1);