package com.jakewharton.rxbinding2.widget; import android.database.DataSetObserver; import android.widget.Adapter; import com.jakewharton.rxbinding2.InitialValueObservable; import io.reactivex.Observer; import io.reactivex.android.MainThreadDisposable; import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread; final class AdapterDataChangeObservable<T extends Adapter> extends InitialValueObservable<T> { private final T adapter; AdapterDataChangeObservable(T adapter) { this.adapter = adapter; } @Override protected void subscribeListener(Observer<? super T> observer) { if (!checkMainThread(observer)) { return; } ObserverDisposable<T> disposableDataSetObserver = new ObserverDisposable<>(adapter, observer); adapter.registerDataSetObserver(disposableDataSetObserver.dataSetObserver); observer.onSubscribe(disposableDataSetObserver); } @Override protected T getInitialValue() { return adapter; } static final class ObserverDisposable<T extends Adapter> extends MainThreadDisposable { private final T adapter; final DataSetObserver dataSetObserver; ObserverDisposable(final T adapter, final Observer<? super T> observer) { this.adapter = adapter; this.dataSetObserver = new DataSetObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(adapter); } } }; } @Override protected void onDispose() { adapter.unregisterDataSetObserver(dataSetObserver); } } }