Я просто очень хочу выучить MVVM. Это довольно тяжело для меня, поэтому я решил обратиться за помощью сюда. Я сделал какой-то фиктивный «проект» для получения данных с сервера через модернизацию. На данный момент все, кажется, работает должным образом, но я заметил, что в примере, которому я следовал, нет репозитория, и я не уверен, как мне это реализовать, могу ли я получить некоторую помощь здесь, пожалуйста ?
Вот код всего проекта
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;
}
}
Модификация Builder
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();
}