如何使用带有 Retrofit 的 MVVM 将存储库实现到我的项目
How do I implement the repository to my project using MVVM with Retrofit
我非常想学习 MVVM。这对我来说有点难,所以我决定在这里寻求帮助。我做了一些虚拟 "project" 来通过改造从服务器接收数据。现在,一切似乎都正常工作,但我注意到我正在关注的示例中没有存储库,我不确定我应该如何实现它,我能在这里得到一些帮助吗? ?
这是整个项目的代码
MainActivity
public class MainActivity extends AppCompatActivity {
PostsAdapter adapter;
RecyclerView recyclerView;
PostsViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewModel = ViewModelProviders.of(this).get(PostsViewModel.class);
viewModel.getPosts();
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
adapter = new PostsAdapter();
recyclerView.setAdapter(adapter);
viewModel.postsMutable.observe(this, new Observer<List<Posts>>() {
@Override
public void onChanged(List<Posts> list) {
adapter.setPostsList(list);
}
});
}
}
适配器
public class PostsAdapter extends RecyclerView.Adapter<PostsAdapter.ViewHolder> {
List<Posts> postsList = new ArrayList<>();
public void setPostsList(List<Posts> postsList){
this.postsList = postsList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Posts posts = postsList.get(position);
if (postsList == null) return;
holder.textView.setText(posts.getText());
}
@Override
public int getItemCount() {
return postsList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
ViewModel
public class PostsViewModel extends ViewModel {
MutableLiveData<List<Posts>> postsMutable = new MutableLiveData<>();
public void getPosts(){
RetrofitBuilder.getInstance().getPosts().enqueue(new Callback<List<Posts>>() {
@Override
public void onResponse(Call<List<Posts>> call, Response<List<Posts>> response) {
postsMutable.setValue(response.body());
}
@Override
public void onFailure(Call<List<Posts>> call, Throwable t) {
}
});
}
}
型号
public class Posts {
@SerializedName("userId")
private int userId;
@SerializedName("id")
private int id;
@SerializedName("title")
private String title;
@SerializedName("body")
private String text;
public int getUserId() {
return userId;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getText() {
return text;
}
}
改造生成器
public class RetrofitBuilder {
public static final String BASE_URL = "https://jsonplaceholder.typicode.com/";
private ApiCalls api;
private static RetrofitBuilder instance;
public RetrofitBuilder() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(ApiCalls.class);
}
public static RetrofitBuilder getInstance() {
if (instance == null) {
instance = new RetrofitBuilder();
}
return instance;
}
public Call<List<Posts>> getPosts(){
return api.getPosts();
}
}
Api 调用
public interface ApiCalls {
@GET("posts")
Call<List<Posts>> getPosts();
}
A Repository
就是您从 http 调用或数据库中获取所有数据的地方,因此您所要做的就是创建一个 class 并将改造调用放在那里而不是视图模型。
所以你的 getPosts()
看起来像这样
public void getPosts(){
List<Posts> posts = myRepository.getPosts();
postsMutable.setValue(posts);
}
根据您的需要进行调整,但这大致就是您要做的。我相信改造现在甚至支持实时数据,所以它可能比那更容易
我非常想学习 MVVM。这对我来说有点难,所以我决定在这里寻求帮助。我做了一些虚拟 "project" 来通过改造从服务器接收数据。现在,一切似乎都正常工作,但我注意到我正在关注的示例中没有存储库,我不确定我应该如何实现它,我能在这里得到一些帮助吗? ?
这是整个项目的代码
MainActivity
public class MainActivity extends AppCompatActivity {
PostsAdapter adapter;
RecyclerView recyclerView;
PostsViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewModel = ViewModelProviders.of(this).get(PostsViewModel.class);
viewModel.getPosts();
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
adapter = new PostsAdapter();
recyclerView.setAdapter(adapter);
viewModel.postsMutable.observe(this, new Observer<List<Posts>>() {
@Override
public void onChanged(List<Posts> list) {
adapter.setPostsList(list);
}
});
}
}
适配器
public class PostsAdapter extends RecyclerView.Adapter<PostsAdapter.ViewHolder> {
List<Posts> postsList = new ArrayList<>();
public void setPostsList(List<Posts> postsList){
this.postsList = postsList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Posts posts = postsList.get(position);
if (postsList == null) return;
holder.textView.setText(posts.getText());
}
@Override
public int getItemCount() {
return postsList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
ViewModel
public class PostsViewModel extends ViewModel {
MutableLiveData<List<Posts>> postsMutable = new MutableLiveData<>();
public void getPosts(){
RetrofitBuilder.getInstance().getPosts().enqueue(new Callback<List<Posts>>() {
@Override
public void onResponse(Call<List<Posts>> call, Response<List<Posts>> response) {
postsMutable.setValue(response.body());
}
@Override
public void onFailure(Call<List<Posts>> call, Throwable t) {
}
});
}
}
型号
public class Posts {
@SerializedName("userId")
private int userId;
@SerializedName("id")
private int id;
@SerializedName("title")
private String title;
@SerializedName("body")
private String text;
public int getUserId() {
return userId;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getText() {
return text;
}
}
改造生成器
public class RetrofitBuilder {
public static final String BASE_URL = "https://jsonplaceholder.typicode.com/";
private ApiCalls api;
private static RetrofitBuilder instance;
public RetrofitBuilder() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(ApiCalls.class);
}
public static RetrofitBuilder getInstance() {
if (instance == null) {
instance = new RetrofitBuilder();
}
return instance;
}
public Call<List<Posts>> getPosts(){
return api.getPosts();
}
}
Api 调用
public interface ApiCalls {
@GET("posts")
Call<List<Posts>> getPosts();
}
A Repository
就是您从 http 调用或数据库中获取所有数据的地方,因此您所要做的就是创建一个 class 并将改造调用放在那里而不是视图模型。
所以你的 getPosts()
看起来像这样
public void getPosts(){
List<Posts> posts = myRepository.getPosts();
postsMutable.setValue(posts);
}
根据您的需要进行调整,但这大致就是您要做的。我相信改造现在甚至支持实时数据,所以它可能比那更容易