2016-11-13 7 views
0

RecyclerViewとがonClick()で動作しない状況に遭遇しました。 ListViewのように、GridViewで画像をタップ/クリックすると、onClickは単一の項目の詳細を返していません。ムービーのポスターをクリックすると、特定のムービーの詳細が表示されるだけでなく、複数のムービーの詳細がスクロールビューに表示されます。以下のコードでAndroid RecyclerView GridLayoutManager onClick now working

ルック:

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

モデルをパーセル可能にするか、モデルフィールドを1つずつ別のキーワードを使用して送信してください。あなたがここで異なる値で同じキーワードを追加している:

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が存在する必要があります。エレメントのViewは、ViewHolderのitemViewフィールドに保持されているので、itemViewに設定することで、エレメントにリスナーを追加できます。 –

+0

'holder.mView.setOnClickListener(新View.OnClickListener(){@Override ます。public void onClickの(ビュービュー){ テントの意図=新しいテント(文脈、MovieDetailsActivity.class); intent.putExtra( "タイトル"、 これは機能しません。これは機能しません。私がクリックすると、アクティビティが意図されますが、NestedScrollViewには20sが表示されます。私はちょうど1つの映画についての詳細がほしいです。 – Ronan

1

クリックリスナーをonCreateViewHolderに設定しないでください。代わりにリスナーをonBindViewHolderに設定してください。

+0

試しました。動作しません。アダプタクラスに 'View.OnClickListener'を実装し、' onBindViewHolder'に 'holder.poster.setOnClickListener(this)'を追加しました。動作しません。私は再びクリックで複数の映画の詳細を取得します – Ronan

関連する問題