0

我在本示例的 getView() 方法中使用了一个静态函数来下载 ImageView 的源代码。稍后将包含线程。但是,我一般想知道在这种情况下如何保存静态函数的使用。

因为我经历过,在某些情况下(当我快速滚动时)图像会混淆。

    /**
    * Is called, when the ListAdapter requests a new ListItem, when scrolling. Returns a listItem (row)
    */
        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.row, null);
                        }
                        Order o = items.get(position);
                        if (o != null) {
                                TextView tt = (TextView) v.findViewById(R.id.toptext);

                                if (tt != null) {
                                      tt.setText("Name: "+o.getOrderName());                            }

//At this point I use a static function to download the bitmap to set it as source of an ImageView

                        }
                        return v;
                }
4

3 回答 3

2

我在本示例的 getView() 方法中使用了一个静态函数来下载 ImageView 的源代码。

我在那篇博文中的任何地方都没有看到静态方法。

因为我经历过,在某些情况下(当我快速滚动时)图像会混淆。

这与静态方法无关,与应用图像有关。行被回收。因此,如果图像的下载时间过长,则可能不再需要该图像-ImageView应该显示其他图像。解决此问题的一种方法是将 in 所需的图像的 URL 粘贴ImageViewsetTag()ImageView本身上。下载完成后,在将下载的图像放入之前ImageView,调用getTag()并比较 URL。如果标签中的 URL 与下载的 URL 不同,请不要更新ImageView,因为这将用于错误的图像。

于 2010-09-30T17:24:31.417 回答
1

我通过不重用渲染器来解决这个问题(这听起来确实比它更痛苦),而是使用带有WeakReference对象的数组来“缓存”它们。这使您的列表速度更快,并防止您在现在用于其他数据的渲染器上设置图像,同时如果内存不足,GC 有机会删除未使用的列表项。

public View getView(int position, View convertView, ViewGroup parent) {
    Renderer result = null;
    WeakReference<Renderer> wr = (WeakReference<Renderer>) _renderers[position];
    if (ref != null)
        result = wr.get();

    if (result == null) {
        result = new Renderer(_context);
        // set the texts here and start loading your images
        _renderers[position] = new WeakReference<Renderer>(result);
    }
    return result;
}

您必须将_renderers[position] 强制转换为WeakReference,因为java 不支持具有泛型的数组,所以_renderers 是一个Objects 数组

于 2010-10-01T12:58:48.247 回答
0

如果静态函数没有副作用,那么使用它应该是完全安全的。根据您对该函数的描述,它似乎确实有副作用,因此您需要确保从不同位置调用该函数不会引起任何冲突。如果没有看到这个功能,我真的不能告诉你更多。

于 2010-09-30T16:31:59.547 回答