1

我一直在尝试重新设置 ImageView 的大小。我正在使用自定义适配器。

View row = convertView;
if (row == null) {
    LayoutInflater inflater =  (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.grid_item, null);
}

thumb = (ImageView) row.findViewById(R.id.bookThumb);

当我使用 ImageView thumb = (ImageView) row.findViewById(R.id.bookThumb); 在自定义适配器内部它工作得很好,但是因为它循环遍历每一行,所以滚动非常慢。

所以...我现在正在尝试获取 thumb = (ImageView) row.findViewById(R.id.bookThumb); 从我的 Main Activity 并设置它的大小,但我得到 Null,因此应用程序强制关闭。

试过:

LinearLayout layout = (LinearLayout) findViewById(R.id.gridLayout);
ImageView thumbRow = (ImageView)layout.findViewById(R.id.bookThumb);

也试过:

// gv is the gridview (R.id.gridview)
ImageView thumbRow = (ImageView)gv.findViewById(R.id.bookThumb);

始终为空。

感谢任何帮助!感觉就像我错过了一些愚蠢的东西:)

4

1 回答 1

3

我认为问题出在两个地方。

先解决原来的问题。由于 findViewById 调用,您的适配器很慢。您利用了回收的视图,这很好,但您仍然遍历视图以获取缩略图。有一种技术,非正式地称为 ViewHolder,基本上使它更像是直接调用。

因此,不仅仅是使用回收的视图作为开始填充数据的地方,还可以附加一些结构,以便您可以预取要操作的元素

if (row == null) {
    LayoutInflater inflater =  (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.grid_item, null);
    row.setTag(row.findViewById(R.id.bookThumb));

}

thumb = (ImageView) row.getTag();

这里我们直接通过变量调用,不做遍历。这应该快得多。

还有第二个问题,NullPointerException。

我认为这是 id 的模糊性与您在主要活动中调用 findViewById 的点混合在一起。你不能在你的 mainActivity 中做得很好,尤其是在涉及滚动的情况下,因为你必须拦截在适配器视图中渲染的调用。大多数回调已经在主线程上,因此在该线程上不能同时发生两件事。

因此,在您调用 findViewById() 时,适配器可能还没有运行并将该视图附加到层次结构中。如果确实如此,它可能还没有完成对它的操作。

在处理第二个问题之前,我会尝试加速您的适配器,因为我不确定是否可以安全或准确地完成它,而无需完全放弃使用适配器视图。

于 2011-03-20T18:14:01.823 回答