@Override public void onUpdate(SortedSet<Post> posts) { synchronized (cells) { boolean formCellAdded = false; long beforeFormCellId = Long.MAX_VALUE; if (!cells.get(cells.size() - 1).equals(formCell)) { final int currentPos = cells.indexOf(formCell); beforeFormCellId = cells.get(currentPos - 1).getItemId(); } cells.clear(); Date prevDate = null; Date lastSeparatorDate = null; ListCell prevCell = null; for (Post post : posts) { Date currentDate = Post.virtualTimestampToDate(post.getVirtualTimestamp()); if (prevDate == null || !isSameDate(prevDate, currentDate)) { lastSeparatorDate = currentDate; prevCell = new DateSeparatorCell(currentDate); cells.add(prevCell); if (!formCellAdded && prevCell.getItemId() == beforeFormCellId) { cells.add(formCell); formCellAdded = true; } } prevDate = currentDate; prevCell = new PostCell(post); cells.add(prevCell); if (!formCellAdded && prevCell.getItemId() == beforeFormCellId) { cells.add(formCell); formCellAdded = true; } } if (lastSeparatorDate == null || !isSameDate(lastSeparatorDate, new Date())) { cells.add(new DateSeparatorCell(new Date())); } if (!formCellAdded) { cells.add(formCell); } observable.notifyChanged(); } }