2017-10-08 5 views
0

Je suis en train de créer un Adapter pour RecyclerView affiché dans ArrayList mais je question sur RecyclerViewHolder publique dans le fond du code. Dois-je utiliser ArrayList dans, ou faire comme le code ci-dessous:RecycleView adaptateur affiché dans ArrayList avec des données JSON

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> { 

    private static final String TAG = RecyclerViewAdapter.class.getSimpleName(); 
    ArrayList<MovieItem> mMoviesItems; 
    private Context context; 

    public RecyclerViewAdapter(ArrayList<MovieItem> MoviesItems) { 
     mMoviesItems = MoviesItems; 
    } 

    @Override 
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     context = viewGroup.getContext(); 
     int layoutIdForListItem = R.layout.movie_list_item; 
     LayoutInflater inflater = LayoutInflater.from(context); 
     boolean shouldAttachToParentImmediately = false; 

     View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); 
     RecyclerViewHolder viewHolder = new RecyclerViewHolder(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerViewHolder holder, int position) { 
     holder.MoviePopularity.setText(mMoviesItems.get(position).getPopularity(popularity)); 
     Picasso.with(this.context).load(mMoviesItems.get(position).getPhoto(poster_path)).into(holder.MoviePoster); 
     holder.MovieName.setText(mMoviesItems.get(position).getName(original_title)); 
    } 

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

    class RecyclerViewHolder extends RecyclerView.ViewHolder { 

     TextView MoviePopularity; 
     ImageView MoviePoster; 
     TextView MovieName; 

     public RecyclerViewHolder(View itemView) { 
      super(itemView); 
      MoviePopularity = (TextView)itemView.findViewById(R.id.movie_popularity); 
      MoviePoster = (ImageView)itemView.findViewById(R.id.iv_item_movie); 
      MovieName = (TextView)itemView.findViewById(R.id.movie_name); 
     } 
    } 
} 

J'ai aussi un problème avec onBindViewHolder() j'obtiens l'erreur sous poster_path, original_title et la popularité

Ceci est mon code de classe personnalisée:

public class MovieItem { 
    private double popularity; 
    private String photo; 
    private String name; 

    public MovieItem(double popularity, String poster_path, String original_title) { 
     this.popularity = this.popularity; 
     this.photo = photo; 
     this.name = name; 
    } 

    public double getPopularity(double popularity) { return popularity; } 
    public String getPhoto() { return photo; } 
    public String getName() { 
     return name; 
    } 
} 

Et la classe de données Json:

public final class OpenMovieJsonUtils { 

    public static ArrayList<MovieItem> getSimpleMovieStringsFromJson(Context context, String moviesJsonString) 
      throws JSONException { 

     final String RESULTS = "results"; 
     final String POPULARITY = "popularity"; 
     final String POSTER_PATH = "poster_path"; 
     final String ORIGINAL_TITLE = "original_title"; 

     ArrayList<MovieItem> parsedMovieData = new ArrayList<MovieItem>(); 

     JSONObject moviesObject = new JSONObject(moviesJsonString); 
     JSONArray moviesArray = moviesObject.getJSONArray(RESULTS); 

     for (int i = 0; i < moviesArray.length(); i++) { 
      double popularity; 
      String poster_path; 
      String original_title; 

      moviesObject = moviesArray.getJSONObject(i); 

      popularity = moviesObject.getDouble(POPULARITY); 
      poster_path = moviesObject.getString(POSTER_PATH); 
      original_title = moviesObject.getString(ORIGINAL_TITLE); 

      parsedMovieData.add(new MovieItem(popularity, poster_path, original_title)); 

     } 

     return parsedMovieData; 
    } 
} 
+0

Quelle est l'erreur que vous recevez? S'il vous plaît poster le journal des erreurs. – merterpam

+5

** Veuillez ne pas vandaliser vos messages. ** Continuer à faire cela pourrait entraîner une suspension. – Glorfindel

Répondre

0

Vous initialisez votre champ de popularité au même champ global de sorte que son par défaut toujours null .also changer votre getter method.Change Votre classe MovieItem comme ceci:

public class MovieItem { 
private double popularity; 
private String photo; 
private String name; 

public MovieItem(double popularity, String poster_path, String original_title) { 
    this.popularity = popularity; 
    this.photo = photo; 
    this.name = name; 
} 

public double getPopularity() { return popularity; } 
public String getPhoto() { return photo; } 
public String getName() { return name; } 

changer maintenant votre méthode de onBindViewHolder comme thhis:

@Override 
public void onBindViewHolder(RecyclerViewHolder holder, int position) { 
    holder.MoviePopularity.setText(String.valueOf(mMoviesItems.g‌​et(position).getPopu‌​larity())); 
    Picasso.with(this.context).load(mMoviesItems.get(position).getPhoto()).into(holder.MoviePoster); 
    holder.MovieName.setText(mMoviesItems.get(position).getName()); 
} 
+0

Je change tout comme vous l'avez dit mais maintenant je reçois une erreur sous le 'holder.MoviePopularity.setText (mMoviesItems.get (position) .getPopularity());' donc je viens d'ajouter (int) mMoviesItems est-il correct d'ajouter int ici? toutes les erreurs passées après cette popularité – user8043603

+0

est double valeur donc vous le changez en 'holder.MoviePopularity.setText (String.valueOf (mMoviesItems.get (position) .getPopularity()));' – ved