javaandroidandroid-livedataandroid-json

cannot put values inside Array List


I've tried to set values inside movies ArrayList in BlogRepository class. but I couldn't find the results in the end.

I want to modify the example so that the storage inside the ArrayList is movies. so the example works and the results show then the example works.

json data :

[
      {
        "albumId": 1,
        "id": 1,
        "title": "accusamus beatae ad facilis cum similique qui sunt",
        "url": "https://via.placeholder.com/600/92c952",
        "thumbnailUrl": "https://via.placeholder.com/150/92c952"
      },
      {
        "albumId": 1,
        "id": 2,
        "title": "reprehenderit est deserunt velit ipsam",
        "url": "https://via.placeholder.com/600/771796",
        "thumbnailUrl": "https://via.placeholder.com/150/771796"
      },
      {
        "albumId": 1,
        "id": 3,
        "title": "officia porro iure quia iusto qui ipsa ut modi",
        "url": "https://via.placeholder.com/600/24f355",
        "thumbnailUrl": "https://via.placeholder.com/150/24f355"
      }
]

Code:

    // 
    public class BlogRepository {

        private ArrayList<Blog2> movies = new ArrayList<>();

        private MutableLiveData<List<Blog2>> mutableLiveData = new MutableLiveData<>();

        private Application application;

        public BlogRepository(Application application){

            this.application = application;
        }

        public MutableLiveData<List<Blog2>> getMutableLiveData() {
            RestApiService service = RetrofitInstance.getApiService();
            Call<List<BlogWrapper>> call = service.getPopularBlog();
            call.enqueue(new Callback<List<BlogWrapper>>(){
                @Override
                public void onResponse(Call<List<BlogWrapper>> call, Response<List<BlogWrapper>> response) {
                    List<BlogWrapper> mBlogWrapper = response.body();
                    for (int i=0; i<mBlogWrapper.size(); i++) {
                       movies = (ArrayList<Blog2>) mBlogWrapper.get(i).getBlog();
                        //Log.d("trace_movies : ",""+ movies);
                    }
                }
                @Override
                public void onFailure(Call<List<BlogWrapper>> call, Throwable t) {
                  //  Toast.makeText(MainActivity.this, "Unable to load users", Toast.LENGTH_SHORT).show();
                    Log.e("trace_2",""+t.getMessage().toString());
                }
            });
            return mutableLiveData;
        }

    }

    // 

    public class Blog2 {

        @SerializedName("albumId")
        private int albumId;
        @SerializedName("id")
        private int id;
        @SerializedName("title")
        private String title;
        @SerializedName("url")
        private String url;
        @SerializedName("thumbnailUrl")
        private String thumbnailUrl;


        public void setAlbumId(int albumId) {
            this.albumId = albumId;
        }

        public void setId(int id) {
            this.id = id;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public void setThumbnailUrl(String thumbnailUrl) {
            this.thumbnailUrl = thumbnailUrl;
        }


        public int getAlbumId() {
            return albumId;
        }

        public int getId() {
            return id;
        }

        public String getTitle() {
            return title;
        }

        public String getUrl() {
            return url;
        }

        public String getThumbnailUrl() {
            return thumbnailUrl;
        }
    }

    /// 

    public class BlogWrapper {

        @SerializedName("data")
        private List<Blog2> mData;
        @SerializedName("error")
        private Boolean mError;
        @SerializedName("message")
        private String mMessage;
        @SerializedName("status")
        private String mStatus;

        public List<Blog2>getBlog() {
            return mData;
        }

        public void setBlog(List<Blog2> data) {
            mData = data;
        }

        public Boolean getError() {
            return mError;
        }

        public void setError(Boolean error) {
            mError = error;
        }

        public String getMessage() {
            return mMessage;
        }

        public void setMessage(String message) {
            mMessage = message;
        }

        public String getStatus() {
            return mStatus;
        }

        public void setStatus(String status) {
            mStatus = status;
        }

    }

    /// 

    public interface RestApiService {

      @GET("/photos")
      public Call<List<BlogWrapper>> getPopularBlog();

    }

    // 

    public class RetrofitInstance {

        private static Retrofit retrofit = null;
        public static final String BASE_URL_ = "https://jsonplaceholder.typicode.com/albums/1/";
         // public static final String BASE_URL_ = "https://androidwave.com/api/";
         public static RestApiService getApiService() {
             Gson gson = new GsonBuilder().setLenient().create();
            if (retrofit == null) {
                retrofit = new retrofit2.Retrofit
                 .Builder()
                   .baseUrl(BASE_URL_)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                      .build();

            }
            return retrofit.create(RestApiService.class);
        }
    }

Solution

  • Try this code, sorry i am away from laptop... mybe you can understand from this. I just swich response object as List<Blog2>, because you need it

    call.enqueue(new Callback<List<Blog2>>(){
                    @Override
                    public void onResponse(Call<List<Blog2>> call, Response<List<Blog2>> response) {
                        List<Blog2> mBlogWrapper = response.body();
                        for (int i=0; i<mBlogWrapper.size(); i++) {
                           movies.add(mBlogWrapper.get(i));
                            //Log.d("trace_movies : ",""+ movies);
                        }
                    }
                });
    

    now you have values from the List, then you can store its value to MutableLivedata.

    Also don't forget to change your Retrofit method

    public interface RestApiService {
    
      @GET("/photos")
      public Call<List<Blog2>> getPopularBlog();
    
    }