How to connect ViewModel with Repository so that data is propagated to the View (MVVM, Livedata)

前端 未结 1 1452
北荒
北荒 2020-12-07 23:58

I\'ve added some code to make my question more clear.

Retrofit interface:

public interface JsonPlaceHolderAPI {
    public static final String BASE_U         


        
1条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-08 00:27

    Api

    public interface TodoApi {
        @GET("todos/")
        Call> getTodos();
    
        @GET("todos/{id}")
        Call getTodo(@Path("id") long id);
    }
    

    Respository

        public class TodoRepository {
        private static final String TAG = "TodoRepository";
        private static final TodoRepository ourInstance = new TodoRepository();
        private TodoApi api;
    
        private MutableLiveData> todoListLiveData = new MutableLiveData<>();
        private MutableLiveData todoLiveData = new MutableLiveData<>();
    
        public static TodoRepository getInstance() {
            return ourInstance;
        }
    
        private TodoRepository() {
            api = ApiBuilder.create(TodoApi.class);
        }
    
        public LiveData> getTodos() {
            api.getTodos().enqueue(new Callback>() {
                @Override
                public void onResponse(@NonNull Call> call, @NonNull Response> response) {
                    todoListLiveData.setValue(response.body());
                }
    
                @Override
                public void onFailure(@NonNull Call> call, @NonNull Throwable t) {
                    Log.d(TAG, "onFailure: failed to fetch todo list from server");
                }
            });
            return todoListLiveData;
        }
    
        public LiveData getTodo(long id) {
            api.getTodo(id).enqueue(new Callback() {
                @Override
                public void onResponse(@NonNull Call call, @NonNull Response response) {
                    todoLiveData.setValue(response.body());
                }
    
                @Override
                public void onFailure(@NonNull Call call, @NonNull Throwable t) {
                    Log.d(TAG, "onFailure: failed to get todo");
                }
            });
            return todoLiveData;
        }
    }
    

    ViewModel

        public class MainActivityViewModel extends ViewModel {
        private static final String TAG = "MainActivityViewModel";
    
        private TodoRepository repository = TodoRepository.getInstance();
    
        private MutableLiveData isLoading = new MutableLiveData<>();
        private LiveData> todoLiveData;
    
        public MainActivityViewModel() {
            super();
            isLoading.setValue(true);
            todoLiveData = repository.getTodos();
        }
    
        @Override
        protected void onCleared() {
            super.onCleared();
        }
    
        public MutableLiveData getIsLoading() {
            return isLoading;
        }
    
        public LiveData> getTodoLiveData() {
            return todoLiveData;
        }
    }
    

    View

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        todoListRecyclerView = findViewById(R.id.todo_recycler_view);
        loadingIndicator = findViewById(R.id.todo_loading_indicator);
        mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
        getSupportActionBar().setTitle("Todos");
    
        mViewModel.getIsLoading().observe(this, new Observer() {
            @Override
            public void onChanged(Boolean isLoading) {
                if (isLoading) loadingIndicator.setVisibility(View.VISIBLE);
                else loadingIndicator.setVisibility(View.GONE);
            }
        });
    
        mViewModel.getTodoLiveData().observe(this, new Observer>() {
            @Override
            public void onChanged(List todos) {
                mViewModel.getIsLoading().postValue(false);
                initRecyclerView(todos);
            }
        });
    }
    

    For full sample

    https://github.com/AnvarNazar/RetrofitTypicodeApiExample

    0 讨论(0)
提交回复
热议问题