我一直在尝试重新设置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);
始终为空。
感谢任何帮助!感觉我错过了一些愚蠢的事情:)
答案 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()时,适配器可能还没有运行,并将该视图附加到层次结构。如果确实如此,它可能还没有完成操作。
在接近第二个问题之前,我会尝试加速你的适配器,因为我不确定它是否可以安全或准确地完成它,而不会完全放弃使用适配器视图。