Есть ли опечатка в вашем коде выше? в методе updateTaskList вы делаете:
taskListField= new TaskListField(incompletetTasks, t);
должно быть:
taskListField= new CustomListField(incompletetTasks, t);
В любом случае, я думаю, что причина, по которой у вас возникают проблемы, заключается в том, что при обновлении списка задач вы фактически создаете новый объект CustomListField. Когда вы впервые добавляете add (taskListField), вы передаете ссылку на поле на экран, поэтому у него есть собственная ссылка. Когда вы вызываете taskListField = new CustomListField (incompletetTasks, t); вы обновляете только свою ссылку, а не ту, что на экране. Поэтому, если вы вызовете «Аннулировать», экран будет перекрашиваться с использованием исходной ссылки, которая также должна содержать ссылки на оригинальные версии незавершенных задач и задач.
Причина, по которой он работает по-другому, заключается в том, что вы фактически удаляете старую ссылку и добавляете новую, поэтому экран теперь знает об обновленных данных.
Что вам нужно сделать, это добавить метод в свой CustomListField, который позволяет обновлять объект списка задач. Затем, когда вы вызываете этот метод для существующей ссылки на taskListField и затем вызываете invalidate, ваш метод рисования теперь должен использовать новые значения, когда он вызывает drawListRow в обратном вызове.