public MainAdapter() { this.changesDetector = new ChangesDetector<>(new SimpleDetector<MainPresenter.AdapterItem>()); }
@Override public void call(@Nonnull ImmutableList<MainPresenter.AdapterItem> items) { this.items = items; changesDetector.newData(this, items, false); }
@Override public boolean same(@Nonnull T item, @Nonnull T newOne) { return item.same(newOne); } }
@Test public void testAddItemInTheMiddle() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two"), new Cat(3, "tree")), false); verify(mAdapter).notifyItemRangeInserted(1, 1); }
@Test public void testItemRemovedAndAdded() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(4, "four")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(2, "two"), new Cat(3, "tree"), new Cat(4, "four")), false); verify(mAdapter).notifyItemRangeChanged(0, 1); verify(mAdapter).notifyItemRangeInserted(1, 1); } }
@Test public void testItemChanged() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one1"), new Cat(3, "tree")), false); verify(mAdapter).notifyItemRangeChanged(0, 1); }
@Test public void testItemDeleted2() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(3, "tree")), false); verify(mAdapter).notifyItemRangeRemoved(1, 1); }
private int notify(@Nonnull ChangesAdapter adapter, int counter, int toRemove, int itemsInserted) { final int itemsChanged = Math.min(itemsInserted, toRemove); toRemove -= itemsChanged; itemsInserted -= itemsChanged; if (itemsChanged > 0) { adapter.notifyItemRangeChanged(counter, itemsChanged); counter += itemsChanged; } if (toRemove > 0) { adapter.notifyItemRangeRemoved(counter, toRemove); } if (itemsInserted > 0) { adapter.notifyItemRangeInserted(counter, itemsInserted); counter += itemsInserted; } return counter; }
final int indexOf = indexOf(list, secondListPosition, first); if (indexOf >= 0) { int itemsInserted = indexOf - secondListPosition; counter = notify(adapter, counter, toRemove, itemsInserted); toRemove = 0; secondListPosition = indexOf + 1; if (force || !mDetector.same(first, second)) { adapter.notifyItemRangeChanged(counter, 1); notify(adapter, counter, toRemove, itemsInserted); mItems = list;
@Before public void setUp() throws Exception { mDetector = new ChangesDetector<>(new ChangesDetector.Detector<Cat, Cat>() { @Nonnull @Override public Cat apply(@Nonnull Cat item) { return item; } @Override public boolean matches(@Nonnull Cat item, @Nonnull Cat newOne) { return item.mId == newOne.mId; } @Override public boolean same(@Nonnull Cat item, @Nonnull Cat newOne) { return item.mId == newOne.mId && Objects.equal(item.mName, newOne.mName); } }); mAdapter = mock(ChangesDetector.ChangesAdapter.class); }
@Override public boolean matches(@Nonnull T item, @Nonnull T newOne) { return item.matches(newOne); }
private int indexOf(@Nonnull List<H> list, int start, @Nonnull H item) { for (int i = start, listSize = list.size(); i < listSize; i++) { H t = list.get(i); if (mDetector.matches(t, item)) { return i; } } return -1; }
@Test public void testForce2() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two")), true); verify(mAdapter).notifyItemRangeChanged(0, 1); verify(mAdapter).notifyItemRangeInserted(1, 1); }
@Test public void testItemSwapped() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(2, "two"), new Cat(3, "tree")), false); verify(mAdapter).notifyItemRangeChanged(0, 1); }
@Test public void testItemDeleted3() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two")), false); verify(mAdapter).notifyItemRangeRemoved(2, 1); }
@Test public void testForce() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one")), true); verify(mAdapter).notifyItemRangeChanged(0, 1); }
@Test public void testItemDeleted1() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one"), new Cat(2, "two"), new Cat(3, "tree")), false); reset(mAdapter); mDetector.newData(mAdapter, ImmutableList.of(new Cat(2, "two"), new Cat(3, "tree")), false); verify(mAdapter).notifyItemRangeRemoved(0, 1); }
@Test public void testStart() throws Exception { mDetector.newData(mAdapter, ImmutableList.of(new Cat(1, "one")), false); verify(mAdapter).notifyItemRangeInserted(0, 1); }