我怎样才能改善ListView的外观

时间:2011-07-27 13:59:34

标签: android listview user-interface

目前我遇到以下问题 - 我创建了自定义 ListView 1 x ImageView + 2 x的的TextView )。它显示来自I-net的内容,这是一个 XML 文件。

我在做什么 - 我正在使用AsyncTask在后台运行下载 XML 内容并通过调用 ListView >来自 doInBackground(...) 方法的每个列表项的publishProgress(...) 方法。当 doInBackground(...) 完成后,我已经收集了我想要显示的每个图像的 URL ,然后从 onPostExecute(...) 方法我开始为图像下载过程并更新每个下载图像的 UI 。对我来说问题是 ListView 应该至少填充几个项目才能开始下载可绘制文件并更新列表。目前, ListView 显示单个项目,当填写下一个项目时,所有图像都已下载。我调试了应用程序,我看到我停在 onPostExecute(...) 方法,并希望获取 ListView 项目的数量,它显示的只返回一个。

有没有办法强制出现 Listview 的项目,在开始下载之前或者因为I-net连接,我有足够的内容,并且没有下载延迟图像。

我忘了只提到每张图片都不大于10KB。

这是我的自定义 AsyncTask

private class DownloadFilesTask extends AsyncTask<String, Object, List<RSSItem>> {
        protected void onPreExecute() {
            super.onPreExecute();

            la.clear();
        }
        protected List<RSSItem> doInBackground(String... urls) {
            parse(urls[0]);

            if (feed == null) { return null; }

            rssList = feed.getAllItems();
            Iterator<RSSItem> iterator = rssList.iterator();

            while(iterator.hasNext()) {
                if (isCancelled()) return null; 
                RSSItem rss = iterator.next();
                publishProgress(rss);
            }

            return rssList;
        }
        protected void onProgressUpdate(Object... progress) {
            super.onProgressUpdate(progress);

            la.add((RSSItem)progress[0]);
            la.notifyDataSetChanged();
        }
        protected void onPostExecute(List<RSSItem> result) {
            super.onPostExecute(result);

            Drawable downloadedImage;
            for (int z = 0; z < rssList.size(); z++) {
                downloadedImage = downloadImage(rssList.get(z).getImageURL());
                ((RSSItem)rssList.get(z)).setImage(downloadedImage);
                la.notifyDataSetChanged();
            }
        }
        protected void onCancelled() {
            super.onCancelled();
        }
    }

以下是自定义 Listadapter

private class ListAdapter extends ArrayAdapter<RSSItem> {

        private List<RSSItem> items;

        public ListAdapter(Context context, int textViewResourceId, List<RSSItem> items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.list_item, null);
            }

            RSSItem item = items.get(position);

            if (item != null) {
                ImageView itemImage = (ImageView) v.findViewById(R.id.ivImage);
                TextView title = (TextView) v.findViewById(R.id.tvTitle);
                TextView description = (TextView) v.findViewById(R.id.tvDescription);
                if (item.getImage() != null) {
                    itemImage.setBackgroundDrawable(item.getImage());
                } else {
                    itemImage.setBackgroundDrawable(getResources().getDrawable(R.drawable.icon));
                }
                if (title != null) {
                    title.setText(item.getTitle());
                }
                if (description != null) {
                    description.setText(item.getDescription());
                }
            }

            return v;
        }
    }

...和项目类:

public class RSSItem {
    private String data = null;
    private String description = null;
    private Drawable image = null;
    private String imageUrl = null;
    private String title = null;

    RSSItem() {
    }

    public void setData(String data) {
        this.data = data;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setImageURL(String imageURL) {
        this.imageUrl = imageURL;
    }

    public void setImage(Drawable image) {
        this.image = image;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getData() {
        return data;
    }

    public String getDescription() {
        return description;
    }

    public Drawable getImage() {
        return image;
    }

    public String getImageURL() {
        return imageUrl;
    }

    public String getTitle() {
        return title;
    }
}

@MODIFICATIONS:

私有类DownloadFilesTask扩展了AsyncTask&gt; {         protected void onPreExecute(){             super.onPreExecute();

        la.clear();
    }

    protected List<RSSItem> doInBackground(String... urls) {
        parse(urls[0]);

        if (feed == null) { return null; }

        rssList = feed.getAllItems();
        publishProgress(true);

        Drawable downloadedImage;
        for (int z = 0; z < rssList.size(); z++) {
            downloadedImage = downloadImage(rssList.get(z).getImageURL());
            ((RSSItem)rssList.get(z)).setImage(downloadedImage);
        }
        return rssList;
    }

    protected void onProgressUpdate(Object... progress) {
        super.onProgressUpdate(progress);

        la.notifyDataSetChanged();
    }

    protected void onPostExecute(List<RSSItem> result) {
        super.onPostExecute(result);

        la.notifyDataSetChanged();
    }

    protected void onCancelled() {
        super.onCancelled();
    }
}

2 个答案:

答案 0 :(得分:2)

我不确定我理解你的问题,但我会做的是以下(如果我做对了):

我想你有一个存储在ListView中的自定义对象,比方说CustomItem。 我会将URL Image的下载放在该对象的构造函数中,并将Drawable存储为CustomItem的成员。在您创建新的CustomItem并获取其图像后,publishProgress()并在列表适配器上调用notifyDataSetChanged()

编辑:您应该在onPostExecute()方法结束时从doInBackground()方法移动代码。

试试这个:

private class DownloadFilesTask extends AsyncTask<String, RSSItem, Void> {
    protected void onPreExecute() {
        super.onPreExecute();
        la.clear();
    }
    protected List<RSSItem> doInBackground(String... urls) {
        parse(urls[0]);

        if (feed == null) { return null; }
        rssList = feed.getAllItems();
        Iterator<RSSItem> iterator = rssList.iterator();

        while(iterator.hasNext()) {
            if (isCancelled()) return null; 
            RSSItem rss = iterator.next();
            //this happens fast no need to do this
            publishProgress(rss);
            //la.add(rss);
        }
        Drawable downloadedImage;
        for (int z = 0; z < rssList.size(); z++) {
            downloadedImage = downloadImage(rssList.get(z).getImageURL());
            ((RSSItem)rssList.get(z)).setImage(downloadedImage);
            publishProgress(null);
        }
        return rssList;
    }
    protected void onProgressUpdate(RSSItem... progress) {
        super.onProgressUpdate(progress);
        if progress!=null
           la.add((RSSItem)progress[0]);
        la.notifyDataSetChanged();
    }
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

    }
    protected void onCancelled() {
        super.onCancelled();
    }
}

答案 1 :(得分:1)

您是否在doInBackground()中填充了列表适配器的基础数据集?然后,除了致电publishProgress()之外,您还需要在adapter.notifyDataSetChanged()的{​​{1}}中致电onProgressUpdate()