The app loads an array of timezones ids from the resources, forms the list of Calendars, based on it, and puts the result to Flowable:

The project contains a base class for RecyclerView.Adapter, that encapsulates default logic of one:

Now we can inherit from this class to implement usual adapter with a minimum amount of code. Another benefit of this approach is an ability to focus on the main logic of DiffUtil.

The DiffUtil.Callback is an abstract class as follows:

Names of getOldListSize() and getNewListSize() methods speaks for themselves. Usually, areItemsTheSame() gets old and new items, compares their ids and returns the appropriate result:

The method areContentTheSame() compares data from items:

If areItemsTheSame() returns true and areContentTheSame() returns false, DiffUtil invokes getChangePayload(). This method services to define which content was changed. You can implement it like this:

You can choose any type of data as a result. The scheme below explains how DiffUtil compares lists.