Android:已下载的图像未显示在ListView中

时间:2013-11-17 20:00:05

标签: java android listview android-asynctask download

我使用AsyncTask从URL下载图像,我想使用自定义适配器在列表视图中显示这些图像。其他所有内容都正确下载,但图片不会显示在我的列表视图中。我尝试了不同的链接,不同的方法(setImageDrawable& setImageBitmap),什么都行不通。希望你们能帮助我,我会发布相关的代码部分。

`private int getEventsLength(String eventsUnformated) {

    int count = 0;
    int startPos = 0;
    String find = "event {";

    while (eventsUnformated.indexOf(find, startPos) != -1) {
        startPos = eventsUnformated.indexOf(find, startPos) + find.length();
        count++;
    }

    return count;
}
private Event[] getEvents(String eventsUnformated) {

    ArrayList<Event> eventList = new ArrayList<Event>();

    int startPos = 0;
    int eventLength = getEventsLength(eventsUnformated);

    for (int i = 0; i < eventLength; i++) {

        ArrayList<String> weirdList = new ArrayList<String>();

        while (weirdList.size() < 6) {
            startPos = eventsUnformated.indexOf(':', startPos) + 1;
            weirdList.add(eventsUnformated.substring(startPos, eventsUnformated.indexOf('\n', startPos)).trim());
        }

        Date eventDate = null;
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

        try {
        eventDate = dateFormat.parse(weirdList.get(2));
        }
        catch (ParseException ex) { }

        try {
        new DownloadImageTask().execute(new URL(weirdList.get(4)));
        }
        catch (MalformedURLException ex) { }

        eventList.add(new Event(weirdList.get(0), weirdList.get(1), eventDate, eventImage, weirdList.get(3)));
    }

    return eventList.toArray(new Event[eventList.size()]);
}
private void populateEventListView() {
    ArrayAdapter<Event> adapter = new EventListAdapter();
    eventListView = (ListView) findViewById(R.id.listView2);
    eventListView.setAdapter(adapter);
}
private class DownloadTask extends AsyncTask<Void, Void, Void> {

    String downloadedEvents = "", downloadedChapters = "";

    @Override
    protected Void doInBackground(Void... params) {

        try {
            URL eventsUrl = new URL("myUrl/events.txt");
            URL chaptersUrl = new URL("myUrl/chapters.txt");

            BufferedReader reader = new BufferedReader(new InputStreamReader(eventsUrl.openStream()));

            String temp = "";
            String news = "";

            while((temp = reader.readLine()) != null) {
                news += temp + "\n";
            }
            reader.close();

            downloadedEvents = news;

            news = "";
            temp = "";

            reader = new BufferedReader(new InputStreamReader(chaptersUrl.openStream()));

            while((temp = reader.readLine()) != null) {
                news += temp + "\n";
            }
            reader.close();

            downloadedChapters = news;
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        ViewFlipper newsFlipper = (ViewFlipper) findViewById(R.id.flipperNews);

        Event[] Events = getEvents(downloadedEvents);
        Chapter[] Chapters = getChapters(downloadedChapters);
        TextView[] Labels = new TextView[Events.length];

        for (int i = 0; i < Events.length; i++) {
            eventList.add(Events[i]);
            Labels[i] = makeNews(Events[i].getEventName());
            newsFlipper.addView(Labels[i]);
        }

        for (int i = 0; i < Chapters.length; i++) {
            chapterList.add(Chapters[i]);
        }

        super.onPostExecute(result);
    }
}
private class EventListAdapter extends ArrayAdapter<Event> {
    public EventListAdapter() {
        super(MainActivity.this, R.layout.listview_event, eventList);
    }

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {
        View myView = convertView;

        if (myView == null)
            myView = getLayoutInflater().inflate(R.layout.listview_event, parent, false);

        Event currentEvent = eventList.get(pos);

        TextView eventName = (TextView) myView.findViewById(R.id.lblEventName);
        eventName.setText(currentEvent.getEventName());
        TextView eventHost = (TextView) myView.findViewById(R.id.lblHostName);
        eventHost.setText(currentEvent.getHostChapter());
        TextView eventDate = (TextView) myView.findViewById(R.id.lblEventDate);
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy kk:mm");
        eventDate.setText(dateFormat.format(currentEvent.getEventDate()));
        TextView eventLocation = (TextView) myView.findViewById(R.id.lblEventLocation);
        eventLocation.setText(currentEvent.getEventLocation());
        ImageView badge = (ImageView) myView.findViewById(R.id.imgEvent);
        badge.setImageDrawable(currentEvent.getEventImage());

        return myView;
    }
}
private class DownloadImageTask extends AsyncTask<URL,Void, Void> {

    @Override
    protected Void doInBackground(URL... imageUrls) {
        try {
            eventImage = Drawable.createFromStream(imageUrls[0].openConnection().getInputStream(), imageUrls[0].toString());
            chapterImage = BitmapFactory.decodeStream(imageUrls[0].openStream());
        }
        catch (MalformedURLException ex) { }
        catch (IOException ioException) { }

        return null;
    }
}`

1 个答案:

答案 0 :(得分:0)

将您的DownloadImageTask更改为:

private class DownloadImageTask extends AsyncTask<ImageView,Void, Bitmap> {
    private ImageView imageView;


    @Override
    protected Void doInBackground(ImageView imv) {
        URL imageURL = (URL) imv.getTag();
        imageView = imv;
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream((InputStream)(imageURL.getContent()));
        } catch (MalformedURLException e) {
            // Invalid URL
        } catch (IOException e) {
            //Problem with connecting internet, or resource is not available
        }
        return bitmap;
    }


    @Override
     protected void onPostExecute(Bitmap b){
         imageView.setImageBitmap(bitmap);
    }

}

在您的适配器中:

badge.setImageDrawable(placeHolderImage);
badge.setTag(currentEvent.getImageURL);
new DownloadImageTask().execute(badge);

当然,您必须将getImageURL添加到Event类中。