2016-09-17 1 views
0

J'essaie de faire un appel de service avec Retrofit et RxJava. J'utilise Picasso 2.5.2 pour télécharger l'image de l'appel de l'API. Je reçois l'image affichée, mais je reçois seulement une image. Quand je débogue, j'ai la taille de 20 mais l'affichage est unique. Toute aide sur ce serait génial.Picasso ne charge qu'une seule image mais la taille est de 20

La classe Adaptateur:

public class PopularMoviesAdapter extends RecyclerView.Adapter<PopularMoviesAdapter.MoviesViewHolder> { 

private final String TAG = PopularMoviesAdapter.class.getSimpleName(); 

private Context context; 
private List<MoviesResponse> movieItems = new ArrayList<>(); 

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

@Override 
public MoviesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movies_grid_item, parent, false); 
    return new MoviesViewHolder(view); 
} 

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

    List<Movies> movies = movieItems.get(position).getResults(); 
    String imageUrl = IntentKeys.MOVIES_POSTER_ENDPOINT + movies.get(position).getPosterPath(); 
    Log.d(TAG, "Poster URL from the API call: " + imageUrl); 
    Picasso.with(context).load(imageUrl).into(holder.imageView); 
    Glide.with(context).load(imageUrl).into(holder.imageView); 

} 

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

class MoviesViewHolder extends RecyclerView.ViewHolder { 

    ImageView imageView; 

    public MoviesViewHolder(View itemView) { 
     super(itemView); 

     imageView = (ImageView) itemView.findViewById(R.id.movies_grid_item_image); 
    } 
}} 

La classe fragment:

public class PopularMoviesFragment extends Fragment { 

    private static final int COLUMN_COUNT = 2; 
    private List<MoviesResponse> responses; 
    private RecyclerView recyclerView; 
    private PopularMoviesAdapter popularMoviesAdapter; 
    private Subscription subscription; 
    private MoviesService service = RetrofitManager.getMoviesClient().create(MoviesService.class); 

    public PopularMoviesFragment() { 
     responses = new ArrayList<>(); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_popular_movies, container, false); 

     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(
       getActivity(), 
       COLUMN_COUNT, 
       LinearLayoutManager.VERTICAL, 
       false); 

     recyclerView = (RecyclerView) view.findViewById(R.id.popular_movies_recycler_view); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(layoutManager); 

     recyclerView.addItemDecoration(new GridSpacingItemDecoration(COLUMN_COUNT, dpToPx(10), true)); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 

     return view; 
    } 

    private int dpToPx(int dp) { 
     Resources r = getResources(); 
     return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics())); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

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

    private void getMoviesSubscription() { 
     subscription = service.getPopularMovies(IntentKeys.POPULAR_MOVIES_API_KEY) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
         new Action1<MoviesResponse>() { 
          @Override 
          public void call(MoviesResponse movies) { 
           responses.add(movies); 
          } 
         }, new Action1<Throwable>() { 
          @Override 
          public void call(Throwable throwable) { 

          } 
         }, new Action0() { 
          @Override 
          public void call() { 
           displayPosters(); 
          } 
         } 
       ); 
    } 

    private void displayPosters() { 
     popularMoviesAdapter = new PopularMoviesAdapter(getContext(), responses); 
     recyclerView.setAdapter(popularMoviesAdapter); 
     recyclerView.invalidate(); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     if (subscription != null && subscription.isUnsubscribed()) { 
      subscription.unsubscribe(); 
     } 
    } 

} 

Enfin, la mise en page:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/movies_grid_item" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <ImageView 
     android:id="@+id/movies_grid_item_image" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true"/> 
</LinearLayout> 

POJO:

public class Movies implements Serializable { 

    private String posterPath; 
    private Boolean adult; 
    private String overview; 
    private String releaseDate; 
    private List<Integer> genreIds = new ArrayList<Integer>(); 
    private Integer id; 
    private String originalTitle; 
    private String originalLanguage; 
    private String title; 
    private String backdropPath; 
    private Float popularity; 
    private Integer voteCount; 
    private Boolean video; 
    private Float voteAverage; 

    // getters and setters ommitted and constructor 
} 


    public class MoviesResponse implements Serializable { 
    private Integer page; 
    private List<Movies> results = new ArrayList<Movies>(); 
    private Integer totalResults; 
    private Integer totalPages; 

    // getters and setters ommitted and constructor 
} 

enter image description here

enter image description here

enter image description here

Merci!

+0

vérifier si est l'image url créé ?? – siddhesh

+0

Image: http://image.tmdb.org/t/p/w185//5N20rQURev5CNDcMjHVUZhpoCNC.jpg – Ronan

+0

votre movieItem Arraylist a sur un seul article comme montré dans l'image, mais cet élément unique a 20 taille.Donc, vous passez le tableau Liste à recvyclerview – siddhesh

Répondre

1

Essayez

Context context = holder.itemView.getContext();

dans votre onBindViewHolder, de sorte que vous ne passez pas le contexte autour.

Essayez également d'ajouter popularMoviesAdapter.notifyDataSetChanged() dans votre fragment. Cela vous dérange-t-il de télécharger votre POJO?

dans votre adaptateur

public PopularMoviesAdapter(List<Movie> movies) { 
    this.movies = movies; 
} 

dans votre fragment

.subscribe(
         new Action1<MoviesResponse>() { 
          @Override 
          public void call(MoviesResponse movies) { 
           responses.add(movies.getResults()); 
           popularMoviesAdapter.notifyDataSetChanged() 
          } 
         } 

changement

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

    List<Movies> movies = movieItems.get(position); 
    String imageUrl = IntentKeys.MOVIES_POSTER_ENDPOINT + movies.get(position).getPosterPath(); 
    Log.d(TAG, "Poster URL from the API call: " + imageUrl); 
    Picasso.with(context).load(imageUrl).into(holder.imageView); 
    Glide.with(context).load(imageUrl).into(holder.imageView); 

} 
+0

'@Override public void onBindViewHolder (titulaire de MoviesViewHolder, position int) { Context context = holder.itemView.getContext(); Liste movies = movieItems.get (position) .getResults(); Chaîne imageUrl = IntentKeys.MOVIES_POSTER_ENDPOINT + movies.get (position) .getPosterPath(); Picasso.avec (contexte) .load (imageUrl) .into (holder.imageView); } '' movieItems' a la taille de 1 et le 'getResults()' a la taille de 20. Pas de chance, n'affiche qu'une seule image – Ronan

+0

En supposant que vous êtes en mesure de voir 20 URL d'image dans votre adaptateur. Pouvez-vous essayer de déplacer 'popularMoviesAdapter = new PopularMoviesAdapter (getContext(), les réponses); recyclerView.setAdapter (popularMoviesAdapter); 'onCreateView? Et ajoutez une vérification nulle dans votre 'getItemCount()'? Plus tard, ajoutez popularMoviesAdapter.notifyDataSetChanged() dans votre Action 1. Supprimez l'action 0 de votre chaîne. – Krunal

+0

Eh bien, ce que je voulais dire, quand je débogue, la taille de 'movies.get (position) .getPosterPath()' est 20. Je vois 20 images dans la liste pour les affiches getResults. Et quand je fais ça, je reçois la réponse json et toutes les données dans la console, mais rien sur la vue. (J'ai fait ce que vous avez suggéré pas de chance) – Ronan

0

Ceci est votre code pour définir l'adaptateur

popularMoviesAdapter = new PopularMoviesAdapter(getContext(), responses); recyclerView.setAdapter(popularMoviesAdapter); 

vos réponses ArrayList = new ArrayList() // ceci est votre arraylist que vous fournissez à l'adaptateur

debug et vérifier la taille des réponses que le nombre d'enregistrements retournera je pense qu'il a sur un objet Je pense que votre tableau est un peu comme ça

responses [{ 
    0,{ 

    } 
}]; 

si passs

popularMoviesAdapter = new PopularMoviesAdapter(getContext(), responses.get(0).getResults 
); recyclerView.setAdapter(popularMoviesAdapter); 
+0

'String imageUrl = IntentKeys.MOVIES_POSTER_ENDPOINT + movies.get (position) .getPosterPath();' Je l'ai pour obtenir le chemin de l'affiche avec la valeur de position de 0. Et oui, la réponse JSON est '{" page ": 1 , "results": [{"poster_path": "\/5N20rQURev5CNDcMjHVUZhpoCNC.jpg" 'Je crois' String imageUrl = IntentKeys.MOVIES_POSTER_ENDPOINT + movieItems.get (0) .getPosterPath(); 'ceci n'obtient qu'un élément, pas tous Les objets. – Ronan