安卓:一个ImageView的的findViewById(自定义适配器)(Android: find

2019-10-16 12:10发布

我一直在试图重新设置的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); 自定义适配器里面的伟大工程,但因为它是通过循环每一行它使滚动很慢。

所以...我现在试图让拇指=(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);

总是空。

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

Answer 1:

我想在两个地方的问题造成的。

首先原来的问题。 您的适配器是因为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()适配器可能没有甚至尚未运行和连接该视图的层次结构。 如果它没有,它可能还没有完呢操纵它。

我会尝试,因为我不知道它甚至有可能做到这一点安全或准确,不放弃使用完全的适配器考虑到您的适配器接近第二个问题之前加快。



文章来源: Android: findViewById of an ImageView (custom adapter)