ArrayList 中显示的 RecyclerView 适配器有 JSON 数据

RecycleView Adapter displayed in ArrayList with JSON data

我正在尝试为 ArrayList 中显示的 RecyclerView 创建一个 Adapter 但我对代码底部的 public RecyclerViewHolder 有疑问。我应该在其中使用 ArrayList 还是像下面的代码一样:

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);
        }
    }
}

我还有一个问题 onBindViewHolder() 我在 poster_path、original_title 和流行度

下出现错误

这是我的自定义class代码:

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;
    }
}

Json 数据 class:

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;
    }
}

您正在将您的人气字段初始化为相同的全局字段,因此默认情况下它总是 null。还要更改您的 getter method.Change 您的 MovieItem class像这样:

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; }

现在像这样更改您的 onBindViewHolder 方法:

    @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());
}