Как мне реализовать репозиторий для моего проекта, используя MVVM с Retrofit - PullRequest
0 голосов
/ 27 марта 2020

Я просто очень хочу выучить 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();
}

1 Ответ

0 голосов
/ 27 марта 2020

A Repository - это именно то место, откуда вы получаете все свои данные, будь то http-вызовы или база данных, поэтому все, что вам нужно сделать, - это создать класс и поместить туда ваши модернизированные вызовы вместо модели представления.

Так что ваш getPosts() будет выглядеть примерно так

public void getPosts(){
    List<Posts> posts = myRepository.getPosts();
    postsMutable.setValue(posts);
}

с учетом ваших потребностей, но это примерно то, что вы будете делать. Я полагаю, что дооснащение теперь даже поддерживает liveata, так что это может быть даже проще, чем

...