Java Can';t似乎无法将图像放入网格视图中
我正试图从TMDb中提取电影海报,并在gridview中显示它们。如果我制作了一个假的ArrayList来保存URL,我就可以得到图像来显示。当我尝试使用解析json得到的URL时,没有显示任何图像。这是我的代码和任务代码Java Can';t似乎无法将图像放入网格视图中,java,android,image,gridview,android-image,Java,Android,Image,Gridview,Android Image,我正试图从TMDb中提取电影海报,并在gridview中显示它们。如果我制作了一个假的ArrayList来保存URL,我就可以得到图像来显示。当我尝试使用解析json得到的URL时,没有显示任何图像。这是我的代码和任务代码 import android.net.Uri; import android.os.AsyncTask; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; i
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class fetchMoviesTask extends AsyncTask<String, Void, String[]> {
private ArrayList<String> mPosterPathArray = new ArrayList<>();
final String LOG_TAG = fetchMoviesTask.class.getSimpleName();
private String[] getMovieDataFromJson(String jsonString) throws JSONException {
final String TMDB_RESULTS = "results";
final String TMDB_OVERVIEW = "overview";
final String TMDB_TITLE = "title";
final String TMDB_RELEASE_DATE = "release_date";
final String TMDB_POSTER_PATH = "poster_path";
JSONObject movieJson = new JSONObject(jsonString);
JSONArray movieArray = movieJson.getJSONArray(TMDB_RESULTS);
String[] resultStrs = new String[20];
for (int i = 0; i < movieArray.length(); i++) {
String title;
String overview;
String releaseDate;
JSONObject movieInfo = movieArray.getJSONObject(i);
title = movieArray.getJSONObject(i).getString(TMDB_TITLE);
resultStrs[i] = title;
}
for (int i = 0; i < movieArray.length(); i++) {
String posterPath = "http://image.tmdb.org/t/p/w780/" + movieArray.getJSONObject(i).getString(TMDB_POSTER_PATH);
mPosterPathArray.add(posterPath);
}
return resultStrs;
}
@Override
protected String[] doInBackground(String... params) {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String jsonStr = null;
String sortBy = "popularity.desc";
String apiKey = "***APIKEYHERE***";
try {
final String API_BASE = "https://api.themoviedb.org/3/discover/movie?";
final String API_SORT = "sort_by=";
final String API_KEY = "api_key";
Uri builtUri = Uri.parse(API_BASE).buildUpon()
.appendQueryParameter(API_SORT, sortBy)
.appendQueryParameter(API_KEY, apiKey)
.build();
URL url = new URL(builtUri.toString());
//Create Request to connect to TMDb
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
//Read inputstream
InputStream inputStream = urlConnection.getInputStream();
StringBuffer stringBuilder = new StringBuffer();
if (inputStream == null) {
jsonStr = null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
// Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
// But it does make debugging a *lot* easier if you print out the completed
// buffer for debugging.
stringBuilder.append(line + "\n");
}
if (stringBuilder.length() == 0) {
jsonStr = null;
}
jsonStr = stringBuilder.toString();
} catch (IOException e) {
Log.e(LOG_TAG, "Error ", e);
// If the code didn't successfully get the weather data, there's no point in attempting
// to parse it.
jsonStr = null;
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("PlaceholderFragment", "Error closing stream", e);
}
}
}
try {
return getMovieDataFromJson(jsonStr);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
}
return null;
}
public ArrayList<String> getPosterPathArray(){
return mPosterPathArray;
}
}
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.util.Log;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
公共类fetchMoviesTask扩展了AsyncTask{
私有ArrayList mPosterPathArray=新ArrayList();
最终字符串LOG_TAG=fetchMoviesTask.class.getSimpleName();
私有字符串[]getMovieDataFromJson(字符串jsonString)抛出JSONException{
最终字符串TMDB_RESULTS=“RESULTS”;
最终字符串TMDB_OVERVIEW=“OVERVIEW”;
最终字符串TMDB_TITLE=“TITLE”;
最终字符串TMDB_RELEASE_DATE=“RELEASE_DATE”;
最终字符串TMDB_POSTER_PATH=“POSTER_PATH”;
JSONObject movieJson=新的JSONObject(jsonString);
JSONArray movieArray=movieJson.getJSONArray(TMDB_结果);
字符串[]resultStrs=新字符串[20];
对于(int i=0;i
这是我的主要片段代码。如果我将硬编码的url传递到realMoviePosters中,那么图像就会显示出来。如果我试图从fetchMoviesTask获取arraylist,它将不起作用
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import java.util.ArrayList;
public class MovieFragment extends Fragment {
public ArrayList<String> realMoviePosters = new ArrayList<>();
public MovieFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_movie, container, false);
fetchMoviesTask fmt = new fetchMoviesTask();
fmt.execute();
//binding to GridView
ImageAdapter test = new ImageAdapter(getActivity(), realMoviePosters);
GridView gridView = (GridView) rootView.findViewById(R.id.gridview_movie);
gridView.setAdapter(test);
return rootView;
}
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.GridView;
导入java.util.ArrayList;
公共类MovieFragment扩展了片段{
public ArrayList realMoviePosters=new ArrayList();
公共电影片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u电影,容器,false);
fetchMoviesTask fmt=新建fetchMoviesTask();
fmt.execute();
//绑定到GridView
ImageAdapter测试=新的ImageAdapter(getActivity(),realMoviePosters);
GridView GridView=(GridView)rootView.findviewbyd(R.id.GridView\u movie);
setAdapter(测试);
返回rootView;
}
这是我的图像适配器
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class ImageAdapter extends BaseAdapter{
private Context mContext;
private ArrayList<String> mTest;
public ImageAdapter(Context c, ArrayList test){
mContext = c;
mTest = test;
}
@Override
public int getCount() {
return mTest.size();
}
@Override
public Object getItem(int i) {
return mTest.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ImageView imageView = new ImageView(mContext);
Picasso.with(mContext)
.load(mTest.get(i))
.into(imageView);
return imageView;
}
}
导入android.content.Context;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入com.squareup.picasso.picasso;
进口