如何使用带有 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);
}

根据您的需要进行调整,但这大致就是您要做的。我相信改造现在甚至支持实时数据,所以它可能比那更容易