2016-11-13 182 views
0

我遇到了RecyclerViewGridLayoutManager不适用于onClick()的情况。像ListView,当我点击/点击GridView中的图片时,onClick不会返回单个项目的详细信息。当我点击一部电影的海报时,它应该只显示关于特定电影的详细信息,而是在一个滚动视图中显示多个电影的详细信息。Android RecyclerView GridLayoutManager onClick现在正在工作

看看下面的代码:

public class MoviesGridAdapter extends RecyclerView.Adapter<MoviesGridAdapter.PosterViewHolder> { 

    private Context context; 
    private List<Movies> movieItems = new ArrayList<>(); 
    CustomItemClickListener listener; 

    public MoviesGridAdapter(Context context, List<Movies> movieItems) { 
     this.context = context; 
     this.movieItems = movieItems; 
    } 


    @Override 
    public PosterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movies_grid_view_item, parent, false); 
     final MoviesGridAdapter.PosterViewHolder vh = new MoviesGridAdapter.PosterViewHolder(view); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final Context zContext = context; 
       Intent intent = new Intent(zContext, MoviesDetailActivity.class); 
       Movies movies = movieItems.get(vh.getAdapterPosition()); 
       intent.putExtra("Items Selection", movies.getPosterPath()); 
       intent.putExtra("Items Selection 1", movies.getTitle()); 
       intent.putExtra("Items Selection 2", movies.getReleaseDate()); 
       intent.putExtra("Items Selection 3", movies.getVoteAverage()); 
       intent.putExtra("Items Selection 4", movies.getOverview()); 
       zContext.startActivity(intent); 
      } 
     }); 
     return vh; 

//  return new PosterViewHolder(view); 
    } 

    public void setMoviesData(List<Movies> moviesData) { 
     movieItems = moviesData; 
     notifyDataSetChanged(); 
    } 


    @Override 
    public void onBindViewHolder(PosterViewHolder holder, final int position) { 

     Context mcontext = context; 
     Movies movies = movieItems.get(position); 

     String posterUrlPath = movies.getPosterPath(); 

     Picasso.with(mcontext) 
       .load(Constants.MOVIES_POSTER_URL + posterUrlPath) 
       .into(holder.poster); 

    } 

    @Override 
    public int getItemCount() { 
     return movieItems.size(); 
    } 

    public class PosterViewHolder extends RecyclerView.ViewHolder { 
     ImageView poster; 
//  Context zContext = context; 

     public PosterViewHolder(final View itemView) { 
      super(itemView); 

//   zContext = itemView.getContext(); 
      poster = (ImageView) itemView.findViewById(R.id.movies_image_view_retrofit); 
//   itemView.setOnClickListener(this); 
     } 

     /*@Override 
     public void onClick(View view) { 

      Movies movies = movieItems.get(getAdapterPosition()); 
      Intent intent = new Intent(zContext, MoviesDetailActivity.class); 
      intent.putExtra("Intent", movies); 
      zContext.startActivity(intent); 
     }*/ 
    } 

} 

而且下面是片段:你们的关注

public class MoviesFragment extends Fragment { 

    private static final int COLUMN_COUNT = 2; 
    private List<Movies> movieItems = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private MoviesGridAdapter adapter; 
    private Subscription subscription; 

    public MoviesFragment() { 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.movies_fragment_content, container, false); 

     GridLayoutManager layoutManager = new GridLayoutManager(getContext(), COLUMN_COUNT); 
     recyclerView = (RecyclerView) view.findViewById(R.id.movies_recycler_view); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(layoutManager); 

     adapter = new MoviesGridAdapter(getActivity(), movieItems); 
     recyclerView.setAdapter(adapter); 

     return view; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     if (movieItems != null) { 
      adapter.setMoviesData(movieItems); 
     } 
     loadDate(); 
    } 

    private void loadDate() { 
     MoviesAPI api = RetrofitManager.getMoviesClient().create(MoviesAPI.class); 

     subscription = api.getPopularMovies(APIKeys.MOVIES_DB_API_KEY) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(
         new Action1<MoviesResponse>() { 
          @Override 
          public void call(MoviesResponse response) { 
           movieItems = response.getMovies(); 
           adapter.setMoviesData(response.getMovies()); 
          } 
         }, new Action1<Throwable>() { 
          @Override 
          public void call(Throwable throwable) { 

          } 
         } 
       ); 
    } 

} 

感谢。我正在寻找的解决方案是:当我点击网格视图中的图片时,我需要关于诸如标题,概述,发布日期等特定电影的详细信息。

回答

2

使您的模型可以parcelable或逐个发送模型字段,但使用不同的关键字。你将在这里与不同的值相同的关键字:

intent.putExtra("Items Selection", movies.getPosterPath()); 
       intent.putExtra("Items Selection", movies.getTitle()); 
       intent.putExtra("Items Selection", movies.getReleaseDate()); 
       intent.putExtra("Items Selection", movies.getVoteAverage()); 
       intent.putExtra("Items Selection", movies.getOverview()); 

这里有一个教程链接,你如何让你的模型parcelable。之后,您可以更新您的适配器,如下所示:

public class MoviesGridAdapter extends RecyclerView.Adapter<MoviesGridAdapter.PosterViewHolder> { 

    private Context context; 
    private List<Movies> movieItems = new ArrayList<>(); 
    CustomItemClickListener listener; 

    public MoviesGridAdapter(Context context, List<Movies> movieItems) { 
     this.context = context; 
     this.movieItems = movieItems; 
    } 


    @Override 
    public PosterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movies_grid_view_item, parent, false); 
     return new PosterViewHolder(view); 
    } 

    public void setMoviesData(List<Movies> moviesData) { 
     movieItems = moviesData; 
     notifyDataSetChanged(); 
    } 


    @Override 
    public void onBindViewHolder(PosterViewHolder holder, final int position) { 

     Movies movie = movieItems.get(position); 

     String posterUrlPath = movie.getPosterPath(); 

     Picasso.with(mcontext) 
       .load(Constants.MOVIES_POSTER_URL + posterUrlPath) 
       .into(holder.poster); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) {    
       Intent intent = new Intent(context, MoviesDetailActivity.class);   
       intent.putExtra("movie", movie) 
       context.startActivity(intent); 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return movieItems.size(); 
    } 

    public class PosterViewHolder extends RecyclerView.ViewHolder { 
     ImageView poster; 
     public PosterViewHolder(View itemView) { 
      super(itemView); 
      poster = (ImageView) itemView.findViewById(R.id.movies_image_view_retrofit); 
     } 
    } 

} 
+0

不能。没有为我工作。我尝试了你的建议。 'onClick'本身就很好。我需要像'ListIView'中的'OnItemSelectedClick'方法。 – Ronan

+0

对不起,它应该是onBindViewHolder中的holder.itemView.setOnClickListener。元素的视图保存在ViewHolder的itemView字段中,因此您可以通过将元素设置为itemView来将侦听器添加到元素中。 –

+0

'holder.mView.setOnClickListener(新View.OnClickListener(){ @Override 公共无效的onClick(查看视图){ 意图意图=新意图(上下文,MovieDetailsActivity.class); intent.putExtra( “标题”, movies.getTitle()); intent.putExtra(“Overview”,movies.getOverview()); context.startActivity(intent); } });' 这是行不通的。当我点击时,它意图展示该活动,但它在NestedScrollView中列出了20秒。我只想要关于一部电影的细节。 – Ronan

1

请勿将您的点击侦听器设置为onCreateViewHolder。取而代之的将您的听众设置为onBindViewHolder方法

+0

试过了。不起作用。我在Adapter类上实现了'View.OnClickListener',并在'onBindViewHolder'上添加'holder.poster.setOnClickListener(this)'。不起作用。我再次点击多个电影细节 – Ronan