gpt4 book ai didi

java - 使用picasso从json数据获取图像时出现空值

转载 作者:行者123 更新时间:2023-12-02 02:31:17 24 4
gpt4 key购买 nike

我尝试创建一个电影应用程序,因此我创建了 recycleview 以使用带有 api json 数据的网络在 gridlayout 中显示海报现在应用程序可以毫无问题地获取电影名称和受欢迎程度,但无法获取海报,当我调试应用程序时,我发现 onbindviewholder 的海报值为 null,为什么会这样?

这是recycleview的适配器:

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

ArrayList<MovieItem> mMoviesItems;
private Context context;

public RecyclerViewAdapter() {

}

class RecyclerViewHolder extends RecyclerView.ViewHolder {

public final TextView MoviePopularity;
public final ImageView MoviePoster;
public final TextView MovieName;

public RecyclerViewHolder(View view) {
super(view);
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);
}
}

@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);
return new RecyclerViewHolder(view);

}

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


@Override
public int getItemCount() {
if (null == mMoviesItems)
return 0;
else {
return mMoviesItems.size();
}
}

public void setMovieData(ArrayList<MovieItem> movieData) {
mMoviesItems = movieData;
notifyDataSetChanged();
}

}

这是自定义类:

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 = poster_path;
this.name = original_title;
}

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

这是 json 类: 公共(public)最终类 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;
}
}

这是网络类:

public final class NetworkUtils {

private static final String TAG = NetworkUtils.class.getSimpleName();

private static final String MOVIES_BASE_URL = "https://api.themoviedb.org/3/movie/";
private static final String MOVIES_URL = MOVIES_BASE_URL;
private static final String apiKey = "36666cbb5d7e20041e705d1b2c4e7a79";

final static String API_PARAM = "api_key";

public static URL buildUrl(String MoviesQuery) {
Uri builtUri = Uri.parse(MOVIES_URL).buildUpon()
.appendPath(MoviesQuery)
.appendQueryParameter(API_PARAM, apiKey)
.build();

URL url = null;
try {
url = new URL(builtUri.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}

Log.v(TAG, "Built URI " + url);
return url;
}

public static String getResponseFromHttpUrl(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = urlConnection.getInputStream();

Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");

boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
} finally {
urlConnection.disconnect();
}
}
}

图像有什么问题,所以我将它们的值设为 null,而不是电影作品的流行度和名称,而不是 null

最佳答案

您的问题不完整,未指定有关您从何处获取 API 响应的完整详细信息。

我可以回答这个问题,因为我刚刚在 Udacity 正在进行的 Android 开发人员纳米学位中完成了这个项目。

希望您从 TMDB 获取电影详细信息。

您应该仔细阅读项目实现指南,其中提到

You will need to append a base path ahead of this relative path to build the complete url you will need to fetch the image using Picasso

以下代码会对您有所帮助 -

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 = poster_path;
this.name = original_title;
}

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

public Uri getFullPosterPath() {
return Uri.parse("http://image.tmdb.org/t/p/")
.buildUpon()
.appendPath("w185")
.appendEncodedPath(getPhoto())
.build();
}
}

并在适配器中进行此更改 -

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

关于java - 使用picasso从json数据获取图像时出现空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47042493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com