Android:ImageView的findViewById(自定义适配器)

时间:2011-03-20 15:01:55

标签: android android-gridview

我一直在尝试重新设置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);在自定义适配器中,它工作得很好但是因为它遍历每一行,所以它使得滚动非常慢。

所以...我现在正试图让拇指=(ImageView)row.findViewById(R.id.bookThumb);从我的主要活动并设置其大小,但我得到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);

始终为空。

感谢任何帮助!感觉我错过了一些愚蠢的事情:)

1 个答案:

答案 0 :(得分: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();

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

还有第二个问题,即NullPointerExcepton。

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

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

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