Может попробовать хранить ссылки на ваши ProgressBar и по таймеру именно у него вызывать invalidate? Тем более вам не нужно перерисовывать всё остальное..
Либо как вариант, пробежаться по всем child у RecyclerView и вызвать им invalidate
Надо не забывать ListView такая монстр штука которая умела делать всё сама, а в RecyclerView много оставили вам самим..
Если посмотреть исходник ListView:
/**
* Causes all the views to be rebuilt and redrawn.
*/
public void invalidateViews() {
mDataChanged = true;
rememberSyncState();
requestLayout();
invalidate();
}
Можно заметить, что данные так или иначе перестроятся..
Тогда в чем именно проблема с notifyDataSetChanged() у вас?