【发布时间】:2016-02-23 11:52:04
【问题描述】:
好吧,这让我发疯了,我想向你们寻求帮助,就像我想自己解决问题一样,这是一场噩梦。我正在制作一个应用程序,用于解析reddit首页的子数据并将信息填充到列表视图中的学习目的。我有几节课:
下载器类
public class DataDownloader extends AsyncTask<String, Void, String> {
private String downloadedData;
@Override
protected String doInBackground(String... params) {
downloadedData = downloadData(params[0]);
if(downloadedData == null){
Log.d("DataDownloader", "There was an error downloading the file");
}
return downloadedData;
}
@Override
protected void onPostExecute(String downloadedFile) {
super.onPostExecute(downloadedFile);
}
private String downloadData(String urlPath){
StringBuilder buffer = new StringBuilder();
try{
URL urlAddress = new URL(urlPath);
HttpURLConnection connect = (HttpURLConnection) urlAddress.openConnection();
int serverResponse = connect.getResponseCode();
Log.d("DataDownloader", "Server responded with response code: " + serverResponse);
InputStream stream = connect.getInputStream();
InputStreamReader streamReader = new InputStreamReader(stream);
int charRead;
char[] inputBuffer = new char[500];
while(true){
charRead = streamReader.read(inputBuffer);
if(charRead <= 0){
break;
}
buffer.append(String.copyValueOf(inputBuffer, 0, charRead));
}
return buffer.toString();
} catch (MalformedURLException e) {
Log.d("DataDownloader", "MalformedURLException");
} catch (IOException e) {
Log.d("DataDownloader", "IOException");
}
return null;
}
}
JSON 解析器类
public class JSONParser {
private String jsonData;
private ArrayList<Submission> submissions;
public JSONParser(String jsonData) {
this.jsonData = jsonData;
submissions = new ArrayList<Submission>();
}
public ArrayList<Submission> getSubmissions() {
return submissions;
}
public void parseJSON() {
Submission submissionContents = null;
if (jsonData != null) {
Log.d("JSONParser.parseJSON", "Looks like JSON data to me");
try {
JSONObject redditJSONObject = new JSONObject(jsonData);
JSONObject data = redditJSONObject.getJSONObject("data");
JSONArray children = data.getJSONArray("children");
for(int i = 0; i < children.length(); i++){
submissionContents = new Submission();
JSONObject submissionDetails = children.getJSONObject(i);
JSONObject submissionInfo = submissionDetails.getJSONObject("data");
submissionContents.setTitle(submissionInfo.getString("title"));
submissionContents.setAuthor(submissionInfo.getString("author"));
submissionContents.setSubReddit(submissionInfo.getString("subreddit"));
submissionContents.setThumbnailLink(submissionInfo.getString("thumbnail"));
submissionContents.setUrlLink(submissionInfo.getString("url"));
submissionContents.setNumComments(submissionInfo.getInt("num_comments"));
submissionContents.setScore(submissionInfo.getInt("score"));
submissions.add(submissionContents);
}
} catch (JSONException j) {
Log.d("JSON.parseJSON", "Error creating JSON object");
}
} else {
Log.d("JSONParser", "The file was empty!");
}
}
}
还有一个类,我必须通过缩略图 url 下载每个链接的位图。
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
String imageUrl = params[0];
Bitmap image = null;
try{
URL url = new URL(imageUrl);
InputStream imageStream = url.openStream();
image = BitmapFactory.decodeStream(imageStream);
} catch (Exception e){
Log.d("ImageDownloader", "Error establishing connection to url: " + imageUrl);
}
return image;
}
}
}
我可以轻松地实现一个常规的 ArrayAdapter 来填充列表,但这只会用文本填充它,我也在寻找一种用图像填充它的方法。我知道我必须创建一个自定义适配器,但老实说我无法弄清楚。我知道您需要创建一个代表每一行的 xml,我已经做到了。此 xml 包括一个图像和 2 个文本视图。我有我的“提交”数组,其中包含每个提交内容(标题、日期等)作为提交对象,但我还必须在那里的某处下载图像。谁能在这里指出我正确的方向?
【问题讨论】:
-
很难理解你的问题。你的意思是你有文本数据和图像,你发现使用自定义适配器很难显示它们,对吧?或者您无法正确获取图像数据?
标签: android android-studio android-arrayadapter