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

前端 未结 1 1450
北荒
北荒 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<List<Todo>> getTodos();
    
        @GET("todos/{id}")
        Call<Todo> 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<List<Todo>> todoListLiveData = new MutableLiveData<>();
        private MutableLiveData<Todo> todoLiveData = new MutableLiveData<>();
    
        public static TodoRepository getInstance() {
            return ourInstance;
        }
    
        private TodoRepository() {
            api = ApiBuilder.create(TodoApi.class);
        }
    
        public LiveData<List<Todo>> getTodos() {
            api.getTodos().enqueue(new Callback<List<Todo>>() {
                @Override
                public void onResponse(@NonNull Call<List<Todo>> call, @NonNull Response<List<Todo>> response) {
                    todoListLiveData.setValue(response.body());
                }
    
                @Override
                public void onFailure(@NonNull Call<List<Todo>> call, @NonNull Throwable t) {
                    Log.d(TAG, "onFailure: failed to fetch todo list from server");
                }
            });
            return todoListLiveData;
        }
    
        public LiveData<Todo> getTodo(long id) {
            api.getTodo(id).enqueue(new Callback<Todo>() {
                @Override
                public void onResponse(@NonNull Call<Todo> call, @NonNull Response<Todo> response) {
                    todoLiveData.setValue(response.body());
                }
    
                @Override
                public void onFailure(@NonNull Call<Todo> 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<Boolean> isLoading = new MutableLiveData<>();
        private LiveData<List<Todo>> todoLiveData;
    
        public MainActivityViewModel() {
            super();
            isLoading.setValue(true);
            todoLiveData = repository.getTodos();
        }
    
        @Override
        protected void onCleared() {
            super.onCleared();
        }
    
        public MutableLiveData<Boolean> getIsLoading() {
            return isLoading;
        }
    
        public LiveData<List<Todo>> 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<Boolean>() {
            @Override
            public void onChanged(Boolean isLoading) {
                if (isLoading) loadingIndicator.setVisibility(View.VISIBLE);
                else loadingIndicator.setVisibility(View.GONE);
            }
        });
    
        mViewModel.getTodoLiveData().observe(this, new Observer<List<Todo>>() {
            @Override
            public void onChanged(List<Todo> todos) {
                mViewModel.getIsLoading().postValue(false);
                initRecyclerView(todos);
            }
        });
    }
    

    For full sample

    https://github.com/AnvarNazar/RetrofitTypicodeApiExample

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