У меня есть сомнения по поводу настройки адаптера RecyclerView, я видел в некоторых руководствах, что они делают адаптер, а затем они делают в том же классе, что и RecyclerView, для которого они устанавливают информацию.Но мой учитель делает это по-другому, он делает 4 класса, адаптер, затем этот класс, чтобы получить всю информацию, которая называется MovieServices:
public class MoviesService
{
public static MoviesService moviesService;
public static MoviesService getInstance()
{
if ( moviesService == null )
{
moviesService = new MoviesService();
}
return moviesService;
}
private List<Movie> movies;
private MoviesService()
{
this.movies = new ArrayList<>();
movies.add( new Movie("001", "El hombre que mató a Liberty Valance", 9.8) );
movies.add( new Movie("002", "Río Rojo", 9.2) );
movies.add( new Movie("003", "Río Bravo", 9.9) );
movies.add( new Movie("004", "La diligencia", 9.1) );
movies.add( new Movie("005", "Que verde era mi valle", 9.8) );
movies.add( new Movie("006", "El hombre tranquilo", 9.3) );
movies.add( new Movie("007", "Misión de audaces", 9) );
movies.add( new Movie("008", "La taberna del irlandés", 8.6) );
movies.add( new Movie("009", "El Padrino", 9.5) );
movies.add( new Movie("010", "El Padrino II", 9.6) );
movies.add( new Movie("011", "El Padrino III", 9.7) );
movies.add( new Movie("012", "Los increibles", 9.2) );
movies.add( new Movie("013", "Los increibles II", 8.9) );
movies.add( new Movie("014", "Coco", 9.6) );
}
public List<Movie> getMovies()
{
return movies;
}
public Movie getMovie(int position)
{
return movies.get( position );
}
public void update(int moviePosition, Movie movie)
{
movies.set(moviePosition, movie);
}
}
Затем он вызвал другой класс с именем
public class MainViewModel extends ViewModel
{
private MoviesService moviesService;
public MainViewModel()
{
moviesService = MoviesService.getInstance();
}
public List<Movie> getMovies()
{
return moviesService.getMovies();
}
public Movie getMovie(int position)
{
return moviesService.getMovie( position );
}
}
И, наконец, класс, у которого есть RecyclerView:
public class MainActivity extends AppCompatActivity implements MovieAdapter.OnItemClickListener
{
private MainViewModel viewModel;
private RecyclerView rv;
private RecyclerView.LayoutManager layoutManager;
private MovieAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
this.rv = findViewById(R.id.rv);
this.layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
this.adapter = new MovieAdapter(this);
this.adapter.setOnItemClickListener(this);
rv.setAdapter( adapter );
rv.setLayoutManager( layoutManager );
adapter.setMovies( viewModel.getMovies() );
}
@Override
public void onItemClick(View view, int position) {
Movie movie = this.viewModel.getMovie(position);
Toast.makeText(this, movie.getName(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, MovieActivity.class );
intent.putExtra(MovieActivity.EXTRA_MOVIE_POSITION, position);
startActivityForResult( intent, 88 );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch ( requestCode )
{
case 88: if ( resultCode == Activity.RESULT_OK)
{
adapter.setMovies( viewModel.getMovies() );
}
break;
}
}
}
Но я не уверен, какой путь более оптимизирован, потому что я думаю, что он делает много вещей, которые, как я считаю, являются ненужными.Спасибо!