定制阵列适配器协助

Custom Array Adapter Assistance

好吧,这让我发疯了,尽管我很想自己解决问题,但我一直在打扰你们寻求帮助,这真是一场噩梦。我正在制作一个应用程序,用于学习目的,它解析 reddit 首页的子数据并将信息填充到列表视图中。我有几个 classes:

下载器Class

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 解析器class

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

}

}

还有一个 class 我必须通过缩略图 link 下载每个 link 的位图 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 个文本视图。我有我的 "submissions" 数组,其中包含每个提交内容(标题、日期等)作为提交 object,但我还必须在其中某处下载图像。谁能在这里指出我正确的方向?

如果您从网络填充图像 url,此问题已在 Android 上为您解决。

我强烈建议从 Google 中查看 Picasso from Square or Glide。两者都有非常简单的语法,可以很好地解决您的问题。他们还将处理缓存,并处理您的视图在加载图像之前滚出屏幕的问题以及进一步的回收问题。

两者都会得到类似的结果:

Picasso.with(context).load(imageUrl).into(imageView);

在您学习的同时 Android 尝试用更现代的 RecyclerView 替换您的 ListView,它会为您处理回收模式并让您更容易启动。