Мнение относительно оформления, так как скилзами в java не обладаю, - код, конечно, пишется для машины, и ей без разницы, как он написан - лишь бы работал, но читать человеку и разбираться для сопровождения и расширения функционала - человеку.
adapter/TaskListAdapter.java
public boolean areItemsTheSame(Task item1, Task item2) {
return !(item1 == null || item2 == null) && item1.getId() == item2.getId();
}
Если не (item1 или item2 равны null) и id итемов одинаковы...
Как я понимаю, если в метод передать item1 = null, то у вас будет nullPointerException или что-то подобное?
Почему бы не изменить конструкцию на item1 != null && item2 != null && item1.getId() == item2.getId(), мне кажется будет читабельней. Возможно покажется глупым использовать длинные названия переменных, вроде originalTask и taskToCompare, но они явно лучше, чем item1 и item2, да и автокомплит IDE поможет в наборе названий
Тернарный оператор внутри if пугает также, как и if без открытия скобок
model/Task.java
if (ActualEndDate != null ? !ActualEndDate.equals(task.ActualEndDate) : task.ActualEndDate != null)
return false;
Поясню - замыленный глаз, конец рабочего дня и голова совсем не варит. Нужно срочно закрыть таску - открываем код и видим необходимый участок, который собираемся закомментить
...
if (длинное условие)
doSomething();
doAnotherThing();
...
...
if (длинное условие)
// doSomething();
doAnotherThing();
...
и теперь наш doAnotherThink выполняется не всегда, а лишь при выполнении условия.
Вот пример такой ошибки в реальном проекте (пункт "Неправильно закомментированная строка")
Ну и
result = 31 * result;
Где 31 используется несколько раз. По мне удобней завести локальную переменную с адекватным значению названием.
Почитайте "Совершенный Код" Макконнелла - шикарнейшая книга для разработчиков