Библиотека подкачки для тех, у кого нет числового идентификатора

На самом деле я использую API Triposo, чтобы показать список стран. https://www.triposo.com/api/

Однако в ответах нет числового идентификатора, и я с трудом увеличиваю размер страницы. Что мне делать с такими ответами, чтобы их преодолеть? Например, Github API полностью подходит для библиотеки подкачки, поскольку он возвращает itemId как числовой.

https://api.github.com/users

Example Response

{
    "results": [
        {
            "name": "Benin",
            "country_id": "Benin",
            "snippet": "A safe and relatively easy country for travellers to visit; birthplace of the Voodoo religion and former home of the Kingdom of Dahomey.",
            "parent_id": null,
            "score": 3.98127216481287,
            "id": "Benin"
        }
],
   "estimated_total": 30845,
   "more": true
}

ItemKeyedDataSource.java

public class ItemKeyedCountryDataSource extends ItemKeyedDataSource<Integer, CountryResult> {

    private EndpointHelper endpointHelper;

    ItemKeyedCountryDataSource() {
        endpointHelper = EndpointHelper.getInstance();
    }

    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<CountryResult> callback) {
        final List<CountryResult> countryResultList = new ArrayList<>();

        endpointHelper.getCountryList(0)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retry(1)
                .onErrorResumeNext(new Func1<Throwable, Observable<? extends CountryWrapper>>() {
                    @Override
                    public Observable<? extends CountryWrapper> call(Throwable throwable) {
                        return Observable.error(throwable);
                    }
                })
                .subscribe(new Subscriber<CountryWrapper>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(CountryWrapper countryWrapper) {
                        if (countryWrapper.getResults().size() > 0) {
                            countryResultList.addAll(countryWrapper.getResults());
                            callback.onResult(countryResultList);
                        }
                    }
                });
    }

    @Override
    public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull final LoadCallback<CountryResult> callback) {
        final List<CountryResult> countryResultList = new ArrayList<>();

        endpointHelper.getCountryList(params.requestedLoadSize)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retry(1)
                .onErrorResumeNext(new Func1<Throwable, Observable<? extends CountryWrapper>>() {
                    @Override
                    public Observable<? extends CountryWrapper> call(Throwable throwable) {
                        return Observable.error(throwable);
                    }
                })
                .subscribe(new Subscriber<CountryWrapper>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(CountryWrapper countryWrapper) {
                        if (countryWrapper.getResults().size() > 0) {
                            countryResultList.addAll(countryWrapper.getResults());
                            callback.onResult(countryResultList);
                        }
                    }
                });
    }

    @Override
    public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<CountryResult> callback) {
        //Do nothing
    }

    @NonNull
    @Override
    public Integer getKey(@NonNull CountryResult item) {
        return ?; // what do I return here?
    }
}

ViewModel.java

public class SearchableActivityViewModel extends ViewModel {

    private LiveData<PagedList<CountryResult>> countryResult;

    SearchableActivityViewModel() {
        Executor executor = Executors.newFixedThreadPool(5);

        CountryResultDataSourceFactory countryResultDataSourceFactory = new CountryResultDataSourceFactory();

        PagedList.Config config = new PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setInitialLoadSizeHint(20) //first load
                .setPageSize(21)
                .build();

        //noinspection unchecked
        countryResult = new LivePagedListBuilder<String, CountryResult>(countryResultDataSourceFactory, config)
                .setFetchExecutor(executor)
                .build();
    }

    public LiveData<PagedList<CountryResult>> getCountryResult(){
        return countryResult;
    }

    @Override
    protected void onCleared() {
        super.onCleared();
    }
}

Заранее спасибо. Надеюсь, я ясен.

Лучший,

Подробная документация для этой веб-службы находится за платным доступом. Каков их синтаксис URL для запроса страниц данных?

CommonsWare 28.05.2018 23:54

Спасибо, @CommonsWare URL для запроса списка стран: triposo.com/api/20180507/… Здесь параметр смещения указывает индекс объекта в наборе результатов, с которого следует начать. Извините, но я должен спрятать свои специальные ключи :)

nuhkoca 28.05.2018 23:59

Если offset указывает позицию, то это похоже на PositionalDataSource.

CommonsWare 29.05.2018 00:41

Я тоже борюсь с той же проблемой. В моем URL-адресе у меня нет страницы. Он вернет все данные при попадании. Вы нашли какое-нибудь решение? Мой вопрос здесь: stackoverflow.com/q/51999197/5716010 @ nuhkoca @ CommonsWare

Maulik Dodia 24.08.2018 12:25
1
4
134
0

Другие вопросы по теме