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

标签 java android listview android-asynctask download

我使用 AsyncTask 从 URL 下载图像,我想使用自定义适配器在 ListView 中显示这些图像。其他一切都在正确下载,但图像不会显示在我的 ListView 中。我尝试了不同的链接、不同的方法(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;
    }
}`

最佳答案

将您的 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 类中。

关于java - Android:下载的图像未显示在 ListView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035427/

相关文章:

android - CursorAdapter 没有填充 SearchView 的建议

java - Android:带有左侧状态行的 ListView

android - 使用 ViewHolder 的 ListActivty 的 BaseAdapter.getView() - Android

java - ListView 每个项目都有不同的布局

javadoc @global 或 @memberAttribute

java - 计算字符中的设置位

Java XSLT 输出在浏览器中错误地显示 A0、B7 字符

java - Spring Boot 基于目录的数据库

android - 搜索 View 从图标化 View 扩展时的事件

android - 手电筒应用程序(如何将屏幕亮度设置为最大?)