How to properly reload liveData manually in Android?












0















My app is a basic news app which fetches data from JSON provided by Guardian API.
I parsed the values from JSON using raw java code (not using retrofit).



Then I get the LiveData in NewsFeedViewModel class which extends as AndroidViewModel.



And then in the fragment, I submit list to adapter.



These are the issues I'm facing:
1) at first, if the articles to show is set to 10, then if i go to settings and change it to 2, then the last 8 articles are disappearing but the white space /gap is not going. I can still scroll through the empty gap.
2) if i change the number of articles value constantly, then app is becoming un-scrollable.



And i have a few more doubts, how to refresh the data manually when swipeToRefresh is happened?



This is my project github link: https://github.com/sdzshn3/News24-7-RV



Video sample of the issue happening in app: https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk










share|improve this question



























    0















    My app is a basic news app which fetches data from JSON provided by Guardian API.
    I parsed the values from JSON using raw java code (not using retrofit).



    Then I get the LiveData in NewsFeedViewModel class which extends as AndroidViewModel.



    And then in the fragment, I submit list to adapter.



    These are the issues I'm facing:
    1) at first, if the articles to show is set to 10, then if i go to settings and change it to 2, then the last 8 articles are disappearing but the white space /gap is not going. I can still scroll through the empty gap.
    2) if i change the number of articles value constantly, then app is becoming un-scrollable.



    And i have a few more doubts, how to refresh the data manually when swipeToRefresh is happened?



    This is my project github link: https://github.com/sdzshn3/News24-7-RV



    Video sample of the issue happening in app: https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk










    share|improve this question

























      0












      0








      0


      1






      My app is a basic news app which fetches data from JSON provided by Guardian API.
      I parsed the values from JSON using raw java code (not using retrofit).



      Then I get the LiveData in NewsFeedViewModel class which extends as AndroidViewModel.



      And then in the fragment, I submit list to adapter.



      These are the issues I'm facing:
      1) at first, if the articles to show is set to 10, then if i go to settings and change it to 2, then the last 8 articles are disappearing but the white space /gap is not going. I can still scroll through the empty gap.
      2) if i change the number of articles value constantly, then app is becoming un-scrollable.



      And i have a few more doubts, how to refresh the data manually when swipeToRefresh is happened?



      This is my project github link: https://github.com/sdzshn3/News24-7-RV



      Video sample of the issue happening in app: https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk










      share|improve this question














      My app is a basic news app which fetches data from JSON provided by Guardian API.
      I parsed the values from JSON using raw java code (not using retrofit).



      Then I get the LiveData in NewsFeedViewModel class which extends as AndroidViewModel.



      And then in the fragment, I submit list to adapter.



      These are the issues I'm facing:
      1) at first, if the articles to show is set to 10, then if i go to settings and change it to 2, then the last 8 articles are disappearing but the white space /gap is not going. I can still scroll through the empty gap.
      2) if i change the number of articles value constantly, then app is becoming un-scrollable.



      And i have a few more doubts, how to refresh the data manually when swipeToRefresh is happened?



      This is my project github link: https://github.com/sdzshn3/News24-7-RV



      Video sample of the issue happening in app: https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk







      java android refresh viewmodel livedata






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 25 '18 at 13:13









      Syed ZeeshanSyed Zeeshan

      113




      113
























          1 Answer
          1






          active

          oldest

          votes


















          0














          You need to do exactly what I did in this Reddit post:



          public class RefreshLiveData<T> extends MutableLiveData<T> {
          public interface RefreshAction<T> {
          private interface Callback<T> {
          void onDataLoaded(T t);
          }

          void loadData(Callback<T> callback);
          }

          private final RefreshAction<T> refreshAction;
          private final Callback<T> callback = new RefreshAction.Callback<T>() {
          @Override
          public void onDataLoaded(T t) {
          postValue(t);
          }
          };

          public RefreshLiveData(RefreshAction<T> refreshAction) {
          this.refreshAction = refreshAction;
          }

          public final void refresh() {
          refreshAction.loadData(callback);
          }
          }


          Then you can do



          public class YourViewModel extends ViewModel {
          private RefreshLiveData<List<Project>> refreshLiveData; // TODO: make `final`

          private final GithubRepository githubRepository;

          public YourViewModel(GithubRepository githubRepository) {
          this.githubRepository = githubRepository;
          }

          public void start(String userId) {
          refreshLiveData = githubRepository.getProjectList(userId); // TODO: use Transformations.switchMap
          }

          public void refreshData() {
          refreshLiveData.refresh();
          }

          public LiveData<List<Project>> getProjects() {
          return refreshLiveData;
          }
          }


          And then repository can do:



          public RefreshLiveData<List<Project>> getProjectList(String userId) {
          final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
          githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
          @Override
          public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
          callback.onDataLoaded(response.body());
          }

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

          }
          });
          });

          return liveData;
          }





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467820%2fhow-to-properly-reload-livedata-manually-in-android%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            You need to do exactly what I did in this Reddit post:



            public class RefreshLiveData<T> extends MutableLiveData<T> {
            public interface RefreshAction<T> {
            private interface Callback<T> {
            void onDataLoaded(T t);
            }

            void loadData(Callback<T> callback);
            }

            private final RefreshAction<T> refreshAction;
            private final Callback<T> callback = new RefreshAction.Callback<T>() {
            @Override
            public void onDataLoaded(T t) {
            postValue(t);
            }
            };

            public RefreshLiveData(RefreshAction<T> refreshAction) {
            this.refreshAction = refreshAction;
            }

            public final void refresh() {
            refreshAction.loadData(callback);
            }
            }


            Then you can do



            public class YourViewModel extends ViewModel {
            private RefreshLiveData<List<Project>> refreshLiveData; // TODO: make `final`

            private final GithubRepository githubRepository;

            public YourViewModel(GithubRepository githubRepository) {
            this.githubRepository = githubRepository;
            }

            public void start(String userId) {
            refreshLiveData = githubRepository.getProjectList(userId); // TODO: use Transformations.switchMap
            }

            public void refreshData() {
            refreshLiveData.refresh();
            }

            public LiveData<List<Project>> getProjects() {
            return refreshLiveData;
            }
            }


            And then repository can do:



            public RefreshLiveData<List<Project>> getProjectList(String userId) {
            final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
            githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
            @Override
            public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
            callback.onDataLoaded(response.body());
            }

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

            }
            });
            });

            return liveData;
            }





            share|improve this answer




























              0














              You need to do exactly what I did in this Reddit post:



              public class RefreshLiveData<T> extends MutableLiveData<T> {
              public interface RefreshAction<T> {
              private interface Callback<T> {
              void onDataLoaded(T t);
              }

              void loadData(Callback<T> callback);
              }

              private final RefreshAction<T> refreshAction;
              private final Callback<T> callback = new RefreshAction.Callback<T>() {
              @Override
              public void onDataLoaded(T t) {
              postValue(t);
              }
              };

              public RefreshLiveData(RefreshAction<T> refreshAction) {
              this.refreshAction = refreshAction;
              }

              public final void refresh() {
              refreshAction.loadData(callback);
              }
              }


              Then you can do



              public class YourViewModel extends ViewModel {
              private RefreshLiveData<List<Project>> refreshLiveData; // TODO: make `final`

              private final GithubRepository githubRepository;

              public YourViewModel(GithubRepository githubRepository) {
              this.githubRepository = githubRepository;
              }

              public void start(String userId) {
              refreshLiveData = githubRepository.getProjectList(userId); // TODO: use Transformations.switchMap
              }

              public void refreshData() {
              refreshLiveData.refresh();
              }

              public LiveData<List<Project>> getProjects() {
              return refreshLiveData;
              }
              }


              And then repository can do:



              public RefreshLiveData<List<Project>> getProjectList(String userId) {
              final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
              githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
              @Override
              public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
              callback.onDataLoaded(response.body());
              }

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

              }
              });
              });

              return liveData;
              }





              share|improve this answer


























                0












                0








                0







                You need to do exactly what I did in this Reddit post:



                public class RefreshLiveData<T> extends MutableLiveData<T> {
                public interface RefreshAction<T> {
                private interface Callback<T> {
                void onDataLoaded(T t);
                }

                void loadData(Callback<T> callback);
                }

                private final RefreshAction<T> refreshAction;
                private final Callback<T> callback = new RefreshAction.Callback<T>() {
                @Override
                public void onDataLoaded(T t) {
                postValue(t);
                }
                };

                public RefreshLiveData(RefreshAction<T> refreshAction) {
                this.refreshAction = refreshAction;
                }

                public final void refresh() {
                refreshAction.loadData(callback);
                }
                }


                Then you can do



                public class YourViewModel extends ViewModel {
                private RefreshLiveData<List<Project>> refreshLiveData; // TODO: make `final`

                private final GithubRepository githubRepository;

                public YourViewModel(GithubRepository githubRepository) {
                this.githubRepository = githubRepository;
                }

                public void start(String userId) {
                refreshLiveData = githubRepository.getProjectList(userId); // TODO: use Transformations.switchMap
                }

                public void refreshData() {
                refreshLiveData.refresh();
                }

                public LiveData<List<Project>> getProjects() {
                return refreshLiveData;
                }
                }


                And then repository can do:



                public RefreshLiveData<List<Project>> getProjectList(String userId) {
                final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
                githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
                @Override
                public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
                callback.onDataLoaded(response.body());
                }

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

                }
                });
                });

                return liveData;
                }





                share|improve this answer













                You need to do exactly what I did in this Reddit post:



                public class RefreshLiveData<T> extends MutableLiveData<T> {
                public interface RefreshAction<T> {
                private interface Callback<T> {
                void onDataLoaded(T t);
                }

                void loadData(Callback<T> callback);
                }

                private final RefreshAction<T> refreshAction;
                private final Callback<T> callback = new RefreshAction.Callback<T>() {
                @Override
                public void onDataLoaded(T t) {
                postValue(t);
                }
                };

                public RefreshLiveData(RefreshAction<T> refreshAction) {
                this.refreshAction = refreshAction;
                }

                public final void refresh() {
                refreshAction.loadData(callback);
                }
                }


                Then you can do



                public class YourViewModel extends ViewModel {
                private RefreshLiveData<List<Project>> refreshLiveData; // TODO: make `final`

                private final GithubRepository githubRepository;

                public YourViewModel(GithubRepository githubRepository) {
                this.githubRepository = githubRepository;
                }

                public void start(String userId) {
                refreshLiveData = githubRepository.getProjectList(userId); // TODO: use Transformations.switchMap
                }

                public void refreshData() {
                refreshLiveData.refresh();
                }

                public LiveData<List<Project>> getProjects() {
                return refreshLiveData;
                }
                }


                And then repository can do:



                public RefreshLiveData<List<Project>> getProjectList(String userId) {
                final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
                githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
                @Override
                public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
                callback.onDataLoaded(response.body());
                }

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

                }
                });
                });

                return liveData;
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 2 at 10:23









                EpicPandaForceEpicPandaForce

                48.3k14128253




                48.3k14128253






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467820%2fhow-to-properly-reload-livedata-manually-in-android%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Futebolista

                    F# list compare

                    Jornalista