两个recyclerview和一个onclick,分别显示相应recyclerview的clicked元素的内容

d8tt03nd  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(389)

问题
在我的城市里,我有两个回收站,分别播放流行电影和顶级电影。当我在recyclerview中单击一部电影时,该电影将被发送到一个显示其详细信息的活动。我回到家里,如果我点击另一个recyclerview的电影,就会显示之前点击的电影。我需要显示在任何循环视图任何点击电影的细节。
我有一个viewholder(moviewholder)

public class MovieViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    //Widgets
    TextView title, rating;
    ImageView imageView;

    //Click listener
    OnMovieListener onMovieListener ;

    public MovieViewHolder(@NonNull View itemView, OnMovieListener onMovieListener) {
        super(itemView);

        this.onMovieListener = onMovieListener;

        title = itemView.findViewById(R.id.movie_title);
        imageView = itemView.findViewById(R.id.movie_img);
        rating = itemView.findViewById(R.id.rating_bar);

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        onMovieListener.onMovieClick(getAdapterPosition());

    }

接口

public interface OnMovieListener {

    void onMovieClick(int position);
    void onCategoryClick(String category);

}

这两个适配器:
这是为流行电影准备的

public class MovieRecyclerView extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<MovieModel> mMovies;
    private final OnMovieListener onMovieListener;

    public MovieRecyclerView(OnMovieListener onMovieListener) {
        this.onMovieListener = onMovieListener;

    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_item,
                parent, false);

        return new MovieViewHolder(view, onMovieListener);

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        ((MovieViewHolder) holder).title.setText(mMovies.get(position).getTitle());
        ((MovieViewHolder) holder).rating.setText(String.valueOf((float) (mMovies.get(position).getVote_average())));

        //ImageView: Using Glide Library
        Glide.with(holder.itemView.getContext())
                .load("https://image.tmdb.org/t/p/w500/"
                        + mMovies.get(position).getPoster_path())
                .into(((MovieViewHolder) holder).imageView);

    }

    @Override
    public int getItemCount() {
        if (mMovies != null) {
            return mMovies.size();
        }
        return 0;
    }

    public void setmMovies(List<MovieModel> mMovies) {
        this.mMovies = mMovies;
        notifyDataSetChanged();
    }

    //Getting the id of the movie clicked
    public MovieModel getSelectedMovie(int position) {
        if (mMovies != null) {
            if (mMovies.size() > 0) {
                return mMovies.get(position);
            }
        }
        return null;
    }

这是给最高级别的

public class MovieLatestRecyclerView extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<MovieModel> mMoviesLatest;
    private OnMovieListener onMovieListener;

    public MovieLatestRecyclerView(OnMovieListener onMovieListener) {
        this.onMovieListener = onMovieListener;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View  view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_item,
                parent, false);
        return new MovieViewHolder(view, onMovieListener);

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        ((MovieViewHolder)holder).title.setText(mMoviesLatest.get(position).getTitle());
        ((MovieViewHolder)holder).rating.setText(String.valueOf((float) (mMoviesLatest.get(position).getVote_average())));

        //ImageView: Using Glide Library
        Glide.with(holder.itemView.getContext())
                .load("https://image.tmdb.org/t/p/w500/"
                        + mMoviesLatest.get(position).getPoster_path())
                .into(((MovieViewHolder)holder).imageView);

    }

    @Override
    public int getItemCount() {
        if(mMoviesLatest != null) {
            return mMoviesLatest.size();
        }
        return 0;
    }

    public void setmMoviesLatest(List<MovieModel> mMoviesLatest) {
        this.mMoviesLatest = mMoviesLatest;
        notifyDataSetChanged();
    }

    //Getting the id of the movie clicked
    public MovieModel getSelectedMovie(int position){
        if(mMoviesLatest != null){
            if(mMoviesLatest.size() > 0){
                return mMoviesLatest.get(position);
            }
        }
        return null;
    }

在mainactivity中,我使用此方法配置recyclerviews

private void ConfigureRecyclerView() {
        movieRecyclerViewAdapter = new MovieRecyclerView(this);
        movieLatestRecyclerViewAdapter = new MovieLatestRecyclerView(this);

        recyclerView_popular.setAdapter(movieRecyclerViewAdapter);
        recyclerView_popular.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));

        recyclerView_latest.setAdapter(movieLatestRecyclerViewAdapter);
        recyclerView_latest.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));

        //RecyclerView Pagination
        //Loading next page of api response
        recyclerView_popular.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                if (!recyclerView.canScrollVertically(1)) {
                    //Here we need to display the next search result
                    movieListViewModel.searchNextPage();
                }
            }
        });
        recyclerView_latest.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                if (!recyclerView.canScrollVertically(1)) {
                    //Here we need to display the next search result
                    movieListViewModel.searchNextPage();
                }
            }
        });

    }

我用它将选定的电影传递给另一个活动

@Override
    public void onMovieClick(int position) {
        //WE don't need position of the movie in recyclerView
        // We need the ID of the movie in order to get all it's details
        Intent intent = new Intent(this, MovieDetails.class);

            intent.putExtra("movie", movieRecyclerViewAdapter.getSelectedMovie(position));
            startActivity(intent);

    }

无论你是谁,我感谢你抽出时间来回答我的问题,我也为某些陈词滥调和篇幅道歉。

pvcm50d1

pvcm50d11#

在这一行:

intent.putExtra("movie", movieRecyclerViewAdapter.getSelectedMovie(position));

你正在看一部电影 movieRecyclerViewAdapter . 此适配器仅用于“流行”电影回收器视图。 onMovieClick 用于“热门”和“顶级”回收者视图。因此,单击“top rated”中的项目将尝试使用“popular”中的项目。
若要解决此问题,单击“top rated”不应尝试从中获取项目 movieRecyclerViewAdapter .
你可以做些改变 onMovieClick(int position)onMovieClick(MovieModel movie) ,因此您不必担心知道从哪个适配器获取电影。

相关问题