Не удается получить данные при вызове API с Retrofit2 - PullRequest
3 голосов
/ 10 января 2020

Я делаю простое приложение, которое должно вызывать API, который возвращает объект с некоторыми атрибутами и отображается в RecyclerView.

Вызов выполняется https://jsonplaceholder.typicode.com/photos?_start=0&_limit=5

Приложение не обрабатывает sh, перерабатывается просмотр, но он пуст. Я использовал отладчик и увидел, что список в адаптере в обзоре реселлера пуст (размер равен 0).

Я полагаю, что проблема связана со структурой java объектов, которые я создал, но я не могу подтвердить это точно, и я не могу изменить свою структуру объекта, чтобы она соответствовала структуре возвращаемого объекта. Я не вижу объект с другими объектами внутри, как с другими API, над которыми я работал (когда я проверяю вышеуказанную ссылку с помощью json онлайн-ридера).

Я обычно делаю свой объект и другой Контейнер объекта (в котором есть список первого объекта). Я подозреваю, что проблема есть, пожалуйста, помогите мне найти проблему. Ниже основного действия, объекта, контейнера объекта, адаптера, модифицированного объекта, объекта dao и контроллера объекта.

Активность:

public class PhotoActivity extends AppCompatActivity implements AdapterPhotoRecyclerView.SelectedPhotoListener {

    private AdapterPhotoRecyclerView adapterPhotoRecyclerView;
    private RecyclerView recyclerView;
    private ProgressBar progressBar;
    private LinearLayoutManager linearLayoutManager;

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

        linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        progressBar = findViewById(R.id.photo_activity_progress_bar);

        makeCall("photos?_start=0&_limit=5");

        adapterPhotoRecyclerView = new AdapterPhotoRecyclerView(this);
        recyclerView = findViewById(R.id.photo_activity_recyclerview);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(adapterPhotoRecyclerView);


    }

    public void makeCall(String fixedUrl) {
        MyPhotoController myPhotoController = new MyPhotoController();
        myPhotoController.getPhotos(fixedUrl, new ResultListener<MyPhotoContainer>() {
            @Override
            public void finish(MyPhotoContainer result) {
                progressBar.setVisibility(View.VISIBLE);
                adapterPhotoRecyclerView.setMyPhotoList(result.getmPhotoList());
                progressBar.setVisibility(View.GONE);
            }
        });
    }

    @Override
    public void selectePhoto(Integer position, List<MyPhoto> myPhotoList) {
        MyPhoto clickedPhoto = myPhotoList.get(position);
        Toast.makeText(this, clickedPhoto.getTitle(), Toast.LENGTH_SHORT).show();
    }
}

Адаптер RecyclerView

public class AdapterPhotoRecyclerView extends RecyclerView.Adapter<AdapterPhotoRecyclerView.PhotoViewHolder> {
    private List<MyPhoto> myPhotoList;
    private SelectedPhotoListener selectedPhotoListener;

    public AdapterPhotoRecyclerView(SelectedPhotoListener selectedPhotoListener) {
        myPhotoList = new ArrayList<>();
        this.selectedPhotoListener = selectedPhotoListener;
    }

    public void setMyPhotoList(List<MyPhoto> myPhotoList) {
        this.myPhotoList = myPhotoList;
        notifyDataSetChanged();
    }

    public List<MyPhoto> getMyPhotoList() {
        return myPhotoList;
    }

    @NonNull
    @Override
    public PhotoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_cell_photo, parent, false);
        PhotoViewHolder photoViewHolder = new PhotoViewHolder(view);
        return photoViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull PhotoViewHolder holder, int position) {
        MyPhoto myPhoto = myPhotoList.get(position);
        holder.bindPhoto(myPhoto);
    }

    @Override
    public int getItemCount() {
        if (myPhotoList == null){
            return 0;
        } else {
            return myPhotoList.size();
        }
    }

    public class PhotoViewHolder extends RecyclerView.ViewHolder {
        private ImageView thumbnail;
        private TextView title;

        public PhotoViewHolder(@NonNull View itemView) {
            super(itemView);
            this.thumbnail = itemView.findViewById(R.id.recyclerview_cell_photo_thumbnail);
            this.title = itemView.findViewById(R.id.recyclerview_cell_photo_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectedPhotoListener.selectePhoto(getAdapterPosition(), myPhotoList);
                }
            });
        }

        public void bindPhoto(MyPhoto myPhoto) {
            Glide.with(itemView).load(myPhoto.getThumbnailUrl()).placeholder(R.mipmap.ic_launcher).into(thumbnail);
            title.setText(myPhoto.getTitle());
        }
    }

    public interface SelectedPhotoListener {
        public void selectePhoto(Integer position, List<MyPhoto> myPhotoList);
    }
}

Object dao

public class MyPhotoDao extends MyRetrofit {
    private JsonPlaceholderService service;


    public MyPhotoDao() {
        super("https://jsonplaceholder.typicode.com/");
        service = retrofit.create(JsonPlaceholderService.class);
    }

    public void getPhotos(String fixedUrl, final ResultListener<MyPhotoContainer> listenerOfTheController) {
        Call<MyPhotoContainer> call = service.jsonPlaceholderPhoto(fixedUrl);
        call.enqueue(new Callback<MyPhotoContainer>() {
            @Override
            public void onResponse(Call<MyPhotoContainer> call, Response<MyPhotoContainer> response) {

                MyPhotoContainer myPhotoContainer = response.body();
                listenerOfTheController.finish(myPhotoContainer);
            }

            @Override
            public void onFailure(Call<MyPhotoContainer> call, Throwable t) {

            }
        });
    }

    public void getAlbum(String fixedUrl, final ResultListener<List<Album>> listenerOfTheController){
        Call<List<Album>> call = service.jsonPlaceholderAlbum(fixedUrl);
        call.enqueue(new Callback<List<Album>>() {
            @Override
            public void onResponse(Call<List<Album>> call, Response<List<Album>> response) {
                List<Album> albumList = response.body();
                listenerOfTheController.finish(albumList);
            }

            @Override
            public void onFailure(Call<List<Album>> call, Throwable t) {

            }
        });

    }
}

Контроллер объекта

public class MyPhotoController {

    public void getPhotos(String fixedUrl, final ResultListener<MyPhotoContainer> listenerOfTheView) {
        MyPhotoDao myPhotoDao = new MyPhotoDao();
        myPhotoDao.getPhotos(fixedUrl, new ResultListener<MyPhotoContainer>() {
            @Override
            public void finish(MyPhotoContainer result) {
                listenerOfTheView.finish(result);
            }
        });
    }

    public void getAlbums(String fixedUrl, final ResultListener<List<Album>> listenerOfTheView){
        MyPhotoDao myPhotoDao = new MyPhotoDao();
        myPhotoDao.getAlbum(fixedUrl, new ResultListener<List<Album>>() {
            @Override
            public void finish(List<Album> result) {
                listenerOfTheView.finish(result);
            }
        });
    }
}

Модифицированный объект

public abstract class MyRetrofit {
    protected Retrofit retrofit;

    public MyRetrofit(String baseUrl) {
        OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder();
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient.build())
                .addConverterFactory(GsonConverterFactory.create());
        retrofit = builder.build();
    }
}

Объект, который я пытаюсь получить

public class MyPhoto implements Serializable {
    @SerializedName("AlbumId")
    private Integer albumNumber;
    @SerializedName("id")
    private Integer photoId;
    private String title;
    @SerializedName("url")
    private String photoUrl;
    private String thumbnailUrl;


    public Integer getAlbumNumber() {
        return albumNumber;
    }

    public Integer getPhotoId() {
        return photoId;
    }

    public String getTitle() {
        return title;
    }

    public String getPhotoUrl() {
        return photoUrl;
    }

    public String getThumbnailUrl() {
        return thumbnailUrl;
    }
}

Контейнер для объектов

public class MyPhotoContainer implements Serializable {
    @SerializedName("array")
    private List<MyPhoto> mPhotoList;

    public List<MyPhoto> getmPhotoList() {
        return mPhotoList;
    }
}

Если чего-то не хватает, дайте мне знать. Любая помощь и комментарии приветствуются!

1 Ответ

0 голосов
/ 10 января 2020

JSON полезная нагрузка не подходит для POJO классов. Вам не нужно использовать MyPhotoContainer класс вообще. Ответ JSON - это JSON Array с прямым размещением JSON Object с. getPhotos метод должен выглядеть аналогично getAlbum методу. Попробуйте:

public void getPhotos(String fixedUrl, final ResultListener<List<MyPhoto>> listenerOfTheView)
...