First a short overview of my code, i hope its understandable:
ToDoElement with a few variables.You should call expListAdapter.notifyDataSetInvalidated()
expListAdapter.notifyDataSetChanged() will just update your views for the new values for each items (no change in any of the elements)
i.e it will again call your getChildView and getGroupView for each item.
You need to add a DeleteMethod of some sort to the Adapter and remove the item from the Adapter manually, not only remove it from the List.
Each time you refresh the the views using notifyDataSetChanged() the Adapter will call the loop around the List. Your List in the Adapter gets a null value due to the changes you made.
Call super in your registerDataSetObserver meke notifyDataSetChanged() working well.
@Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
}