Paging-Bibliothek ohne Raum

Alle Beispiele der neuen paging-Bibliothek wurden mit Raum, Bibliothek und Zimmer-erstellt eine Daten-Quelle für uns. In meinem eigenen Fall, ich brauche, um meine eigene Datenquelle.

Hier ist eine Methode, die meiner Ansicht Modell-Klasse, die sollten zurückkehren, die live-Daten. Meine livedata immer null zurück.

 LiveData<PagedList<ApiResult>> getData(){

    LivePagedListProvider<Integer,ApiResult> p = new LivePagedListProvider<Integer, ApiResult>() {
        @Override
        protected DataSource<Integer, ApiResult> createDataSource() {
            return new DataClass();
        }

    };

    listLiveData = p.create(0,new PagedList.Config.Builder()
            .setPageSize(5) //number of items loaded at once
            .setPrefetchDistance(0)//the distance to the end of already loaded list before new data is loaded
            .build());
    return listLiveData;
}

Und hier ist die Daten-Klasse

public class DataClass extends TiledDataSource<ApiResult> {

    private List<ApiResult> result = new ArrayList<>();

    @Override
    public int countItems() {
        return result.size();
    }

    @Override
    public List<ApiResult> loadRange(int startPosition, int count) {

        Call<String> call = NetworkModule.providesWebService().makeRequest();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
                Log.i(DataClass.this.getClass().getSimpleName() + " - onResponse", String.valueOf(response));
                result = parseJson(response.body());
            }

            @Override
            public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
                Log.i(DataClass.this.getClass().getSimpleName() + " - onFailure", t.getMessage());
            }

        });

        return result;
    }

}
InformationsquelleAutor Idee | 2017-10-07



2 Replies
  1. 7

    Ich denke, das kann helfen:

    1. countItems() zurückgeben sollte DataSource.COUNT_UNDEFINED

    2. loadRange(int startPosition, int count): können Sie direkt die Abfrage ausführen.

    3. So, jetzt können Sie löschen Ergebnis Globale variable

    Auch, Abzweigung Platzhalter:

    listLiveData = p.create(0,new PagedList.Config.Builder()
            .setPageSize(5) //number of items loaded at once
            .setPrefetchDistance(10) //Must be >0 since placeholders are off
            .setEnablePlaceholders(false)
            .build());

    Hier ist der aktualisierte code für die Daten-Klasse:

    public class DataClass extends TiledDataSource<ApiResult> {
    
    @Override
    public int countItems() {
     return DataSource.COUNT_UNDEFINED;
    }
    
    @Override
    public List<ApiResult> loadRange(int startPosition, int count) {
    
     Call<String> call = NetworkModule.providesWebService().makeRequest();
     Response<String> response = call.execute();
     return parseJson(response.body());
    }

    Können Sie eine Beispiel-Projekt hier:
    https://github.com/brainail/.samples/tree/master/ArchPagingLibraryWithNetwork

    • livedata ist immer noch null
    • Ich glaube, wir haben zu halten prefetchDistance > 0, da nur jetzt habe ich versucht die Einstellung prefetch-Abstand auf 0 und hielt Platzhalter ausgeschaltet und es ein Fehler geworfen: Verursacht durch: java.lang.IllegalArgumentException: Platzhalter und prefetch sind die einzigen Möglichkeiten, um die trigger-laden von mehr Daten in der PagedList, also entweder Platzhalter aktiviert werden muss, oder prefetch-Abstand muss sein, > 0.
    • Überprüfen Sie meine repo github.com/KingIdee/pagination-with-network-call Sie können einen pull-request
    • Sicher haben Sie einen Blick
    • Ich habe einen pull-request eingereicht, schauen Sie, es funktioniert wie ein Charme!
  2. 2

    Können Sie erstellen eine Benutzerdefinierte Datenquelle, in der Regel, die wir gebaut backend-API zum abrufen von Daten, nimmt die Seitennummer als parameter zur Rückgabe der angegebenen Seite.

    Für diese situation, die Sie verwenden können, PageKeyedDataSource. Hier ist ein Beispiel-code von PageKeyedDataSource mit dem StackOverflow API. Der code unten ist mit Nachrüsten, um die Daten aus dem StackOverflow API.

    public class ItemDataSource extends PageKeyedDataSource<Integer, Item> {
    
        //the size of a page that we want
        public static final int PAGE_SIZE = 50;
    
        //we will start from the first page which is 1
        private static final int FIRST_PAGE = 1;
    
        //we need to fetch from stackoverflow
        private static final String SITE_NAME = "stackoverflow";
    
    
        //this will be called once to load the initial data
        @Override
        public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<Integer, Item> callback) {
            RetrofitClient.getInstance()
                    .getApi().getAnswers(FIRST_PAGE, PAGE_SIZE, SITE_NAME)
                    .enqueue(new Callback<StackApiResponse>() {
                        @Override
                        public void onResponse(Call<StackApiResponse> call, Response<StackApiResponse> response) {
                            if (response.body() != null) {
                                callback.onResult(response.body().items, null, FIRST_PAGE + 1);
                            }
                        }
    
                        @Override
                        public void onFailure(Call<StackApiResponse> call, Throwable t) {
    
                        }
                    });
        }
    
        //this will load the previous page
        @Override
        public void loadBefore(@NonNull final LoadParams<Integer> params, @NonNull final LoadCallback<Integer, Item> callback) {
            RetrofitClient.getInstance()
                    .getApi().getAnswers(params.key, PAGE_SIZE, SITE_NAME)
                    .enqueue(new Callback<StackApiResponse>() {
                        @Override
                        public void onResponse(Call<StackApiResponse> call, Response<StackApiResponse> response) {
    
                            //if the current page is greater than one
                            //we are decrementing the page number
                            //else there is no previous page
                            Integer adjacentKey = (params.key > 1) ? params.key - 1 : null;
                            if (response.body() != null) {
    
                                //passing the loaded data
                                //and the previous page key 
                                callback.onResult(response.body().items, adjacentKey);
                            }
                        }
    
                        @Override
                        public void onFailure(Call<StackApiResponse> call, Throwable t) {
    
                        }
                    });
        }
    
        //this will load the next page
        @Override
        public void loadAfter(@NonNull final LoadParams<Integer> params, @NonNull final LoadCallback<Integer, Item> callback) {
            RetrofitClient.getInstance()
                    .getApi()
                    .getAnswers(params.key, PAGE_SIZE, SITE_NAME)
                    .enqueue(new Callback<StackApiResponse>() {
                        @Override
                        public void onResponse(Call<StackApiResponse> call, Response<StackApiResponse> response) {
    
                            if (response.body() != null) {
                                //if the response has next page
                                //incrementing the next page number
                                Integer key = response.body().has_more ? params.key + 1 : null; 
    
                                //passing the loaded data and next page value 
                                callback.onResult(response.body().items, key);
                            }
                        }
    
                        @Override
                        public void onFailure(Call<StackApiResponse> call, Throwable t) {
    
                        }
                    });
        }
    }

    Hier kannst du sehen, bekommen wir das Ergebnis, indem Sie eine Nachrüstung anrufen und dann schieben wir das Ergebnis um Rückruf.

    Für eine detaillierte Schritt für Schritt Erklärung, gehen durch diese Android-Paging-Bibliothek-Tutorial.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.