Как искать в списке по страницам при использовании модернизации и комнаты - PullRequest
0 голосов
/ 12 апреля 2019

Я показываю PagedList, который использует источники данных Retrofit и Room.Как выполнить поиск по всему списку, пока он все еще находится на первой странице.

Я пытался выполнить поиск с помощью Room.Но я не могу получить элементы, которые еще не добавлены в БД.

Вот мой репозиторий

public class ItemsRepository {
    private static final String TAG = "ItemsRepository";

    private static ItemsRepository instance;
    final private ItemsNetwork network;
    final private ItemsDatabase database;
    final private MediatorLiveData liveDataMerger;


    public ItemsRepository(Context context) {
        NetItemsDataSourceFactory dataSourceFactory = new NetItemsDataSourceFactory(context);

        network = new ItemsNetwork(dataSourceFactory, boundaryCallBack);
        database = ItemsDatabase.getInstance(context.getApplicationContext());

//                When we get new Items from network we set them into the database
        liveDataMerger = new MediatorLiveData();
        liveDataMerger.addSource(network.getPagedItems), value -> {

            liveDataMerger.setValue(value);


        });


//        Save Items into DB

        dataSourceFactory.getItems().
                observeOn(Schedulers.io()).
                subscribe(item -> {
                    ((ItemsDatabase) database).itemsDao().insertItems(item);
                });
    }

    private PagedList.BoundaryCallback<Item> boundaryCallBack = new PagedList.BoundaryCallback<Item>() {
        @Override
        public void onZeroItemsLoaded() {
            super.onZeroItemsLoaded();

            liveDataMerger.addSource(database.getPagedItems(), value -> {
                liveDataMerger.setValue(value);
                liveDataMerger.removeSource(database.getPagedItems());
            });

        }
    };

    public static ItemsRepository getInstance(Context context) {
        if (instance == null) {
            instance = new ItemsRepository(context);
        }
        return instance;
    }

    public LiveData<NetworkState> getNetworkState() {
        return network.getNetworkState();
    }

    public LiveData<PagedList<Items>> getItems() {
        return liveDataMerger;
    }


}

Я не уверен, что это лучший способ, сначала запросить по сети, а затем обновитьпредметы или запросить номер БД напрямую

...