名前、ポスターなどのようにインターネットから映画データを取得していますが、映画のジャンルについてはネットから再度取得する必要があります。だから私はこの問題の解決策です。RecyclerView.Adapterでインターネットからデータを読み込みます。
public class MoviesViewAllAdapter extends RecyclerView.Adapter<MoviesViewAllAdapter.MoviesViewHolder> {
private Context mContext;
private List<MovieBrief> mMovies;
public MoviesViewAllAdapter(Context context, List<MovieBrief> movies) {
mContext = context;
mMovies = movies;
}
@Override
public MoviesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MoviesViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_movie_large,parent,false));
}
@Override
public void onBindViewHolder(MoviesViewHolder holder, int position) {
holder.movieGenreTextView.setText("");
setGenres(holder, mMovies.get(position).getId());
}
@Override
public int getItemCount() {
return mMovies.size();
}
public class MoviesViewHolder extends RecyclerView.ViewHolder {
public TextView movieGenreTextView;
public MoviesViewHolder(View itemView) {
super(itemView);
movieGenreTextView = (TextView) itemView.findViewById(R.id.text_view_genre_movie_card);
}
}
private void setGenres(final MoviesViewHolder holder, Integer movieId) {
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<Movie> call = apiService.getMovieDetails(movieId,mContext.getResources().getString(R.string.MOVIE_DB_API_KEY));
call.enqueue(new Callback<Movie>() {
@Override
public void onResponse(Call<Movie> call, Response<Movie> response) {
if(response.code() != 200) return;
List<Genre> genresList = response.body().getGenres();
String genres = "";
for (int i=0;i<genresList.size();i++) {
if(i == genresList.size()-1) {
genres = genres.concat(genresList.get(i).getGenreName());
}
else {
genres = genres.concat(genresList.get(i).getGenreName()+", ");
}
}
holder.movieGenreTextView.setText(genres);
}
@Override
public void onFailure(Call<Movie> call, Throwable t) {
}
});
}
}
しかし、ここで問題が浮気を実行し、表示されているジャンルは、映画に関連していないrecyclerviewを上がっていく時に、ロードされているジャンルがランダムであるということです。 onBindViewHolderでデータをロードしていて、ホルダーがスクリーンから消えるとランダムホルダーにロードされている可能性があります。そうですか?
ここでは電話をかけてはいけません。呼び出された回数を制御することはできません。一度にいくつかのリクエストをすることができない限り、ムービーリストを1つずつ取得した後に行います。 –
また、コードの代わりに 'if(!response.isSuccessful())return;'を使いたいとします。 –
@MatiasOloccoそのコードを200でチェックしました。 はresponse.isSuccessful()と同じですか?この方法については知りませんでした。 –