Android - ответ API возвращает OK, но список пуст - PullRequest
0 голосов
/ 19 ноября 2018

Я использую Google Books API для отображения соответствующей информации о книгах (например, название, авторы, издатель ...) в recyclerview и для этого я использую Retrofit2, кажется, все работает нормально код состояния200 (что в соответствии с документацией Google означает ОК), но список, содержащий книги, пуст, ниже вы найдете код для каждого присоединенного соответствующего класса

Начиная с интерфейса API, который включает методпоиска книги по ее id:

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiInterface {
    @GET("volumes/{id}")
    Call<BookResponce> getBooks(@Path("id") String id, @Query("API_KEY") String apiKey);
}

Вот класс экземпляра Retrofit, который я использую:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitInstance {
    private static Retrofit retrofit;
    private static final String BASE_URL = "https://www.googleapis.com/books/v1/";

    public static Retrofit getRetrofitInstance(){
        if (retrofit == null){
            retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        }
        return retrofit;
    }
}

Ниже приведен Book.java Класс модели

@SerializedName("id")
private String bookId;

@SerializedName("description")
private String bookDescription;

@SerializedName("title")
private String bookTitle;

@SerializedName("authors")
private List<String> bookAuthors = new ArrayList<>();

@SerializedName("averageRating")
private float bookRating;

Теперь, вот класс Откликов Книг

@SerializedName("kind")
private String bkind;

@SerializedName("items")
private List<Book> results;

@SerializedName("totalItems")
private int totalItems;

Наконец, класс Основной Деятельности

public static final String BOOKS_API_KEY = "...";
private List<Book> bookList = new ArrayList<>();
private RecyclerView rv;
private BookAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    rv = (RecyclerView) findViewById(R.id.recycler_a);

    mAdapter = new BookAdapter(bookList);

    rv.setLayoutManager(new LinearLayoutManager(this));
    rv.setAdapter(mAdapter);

    DisplayBook();
}

private void DisplayBook(){
    ApiInterface apiService =
            RetrofitInstance.getRetrofitInstance().create(ApiInterface.class);

    retrofit2.Call<BookResponce> call = apiService.getBooks("zyTCAlFPjgYC", BOOKS_API_KEY);
    call.enqueue(new Callback<BookResponce>() {
        @Override
        public void onResponse(retrofit2.Call<BookResponce> call, Response<BookResponce> response) {
            int statusCode = response.code();
            int totalItems = response.body().getTotalItems();
            List<Book> books = response.body().getResults();
            bookList = books;
            mAdapter.notifyDataSetChanged();

            Toast.makeText(getApplicationContext(), "code: "+statusCode+" | total "+totalItems, Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(retrofit2.Call<BookResponce> call, Throwable t) {
            Toast.makeText(getApplicationContext(), "fail", Toast.LENGTH_LONG).show();
        }
    });     
}

Пожалуйста, имейте в виду, что основная проблема здесь:

STATUS CODE = 200 (Success)
but
TOTAL ITEMS RETURNED = 0 /** List<Book> books = response.body().getResults(); */
...