Как правильно перезагрузить liveData вручную в Android? - PullRequest
0 голосов
/ 25 ноября 2018

Мое приложение - это основное новостное приложение, которое извлекает данные из JSON, предоставляемые Guardian API.Я проанализировал значения из JSON, используя необработанный код Java (без использования модификации).

Затем я получаю LiveData в классе NewsFeedViewModel, который расширяется как AndroidViewModel.

И затем во фрагменте я отправляю списокк адаптеру.

Вот проблемы, с которыми я сталкиваюсь: 1) сначала, если статьи для показа установлены на 10, затем, если я иду в настройки и меняю его на 2, то последние 8 статейисчезают, но пустое пространство / разрыв не собирается.Я все еще могу прокрутить пустой пробел.2) если я постоянно меняю значение количества статей, приложение перестает прокручиваться.

И у меня есть еще несколько сомнений, как обновить данные вручную, когда произошел swipeToRefresh?

Это ссылка на мой проект github: https://github.com/sdzshn3/News24-7-RV

Пример видео, возникающего в приложении: https://drive.google.com/file/d/1gr_fabS2rqREuyecvGSG3IQ_jXOowlW7/view?usp=drivesdk

1 Ответ

0 голосов
/ 02 января 2019

Вы должны сделать именно то, что я сделал в этом сообщении Reddit :

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);
    }
}

Тогда вы можете сделать

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;
    }
}

И тогда репозиторий может сделать:

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;
}
...