2011-03-20 81 views
1

我一直在试图重新设置ImageView的大小。 我正在使用自定义适配器。Android:findViewById的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的拇指=(ImageView的)row.findViewById(R.id.bookThumb);在自定义适配器内部,它的工作效果很好,但由于它遍历每一行,因此滚动非常缓慢。

所以...我现在试图让thumb =(ImageView)row.findViewById(R.id.bookThumb);从我的主要活动,并设置其大小,但我得到空,因此应用程序部队关闭。

尝试:

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); 

总是空。

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

+2

尝试使用'hierarchyviewer'来查看实际上您的视图层次结构的样子。 – 2011-03-20 15:08:20

+0

在你的主要活动中你在做什么?它是否在setContentView被调用之后? – slund 2011-03-20 15:20:58

+0

@Gil,我会尝试使用...谢谢。 @slund,是的,之后。此外,检查任何虚假进口的android.R,关闭ImageView与/>而不是,基本上做了我在谷歌上找到的所有东西:) – 2011-03-20 15:24:17

回答

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。

我认为这是与您在主要活动中调用findViewById的点混在一起的ids的含糊性。在mainActivity中不能很好地完成这项工作,特别是在涉及滚动的情况下,因为您必须拦截在适配器视图中呈现的调用。大多数回调已经在主线程中,所以在该线程上不能同时发生两件事情。

因此,在您称为findViewById()的位置,适配器甚至可能还没有运行,并将该视图附加到层次结构中。如果确实如此,它可能还没有完成操纵它。

在接近第二个问题之前,我会尝试加快您的适配器速度,因为我不确定甚至可以安全或准确地执行此操作,而无需完全放弃使用适配器视图。

+0

格雷格,谢谢你解释得很好的答案! 不幸的是,它并没有影响我的速度问题。 导致速度问题的原因是我写的一个函数,它根据用户屏幕大小和某些设置更改缩略图大小。 我知道这是导致主要速度减慢,因为当我禁用它,gridview滚动平滑(就像我在我的应用程序中有listview)。 我觉得很奇怪,不可能在任何地方使用代码来改变ImageView的XML ... 我只想改变它的宽度和高度。 – 2011-03-20 19:11:36

+0

但是你不能改变缩略图吗?你不必在UI线程上做到这一点。 imageview也会缩放图像(不幸的是在UI线程中)。你看到多少减速? – 2011-03-20 21:15:52

+0

没有那么多的放缓,但比我的列表视图明显,我不做这些计算。 问题是我在运行时计算缩略图大小,因为用户可以选择他是否想要2列或3列。与此同时,我还考虑了屏幕分辨率。 – 2011-03-20 21:20:10