我正在使用GridView来显示一些图像并且我遇到了问题,因为onClickListener不适用于第一个图像.我在SO处发现了一些其他问题同样的问题,但我不喜欢他们的"正确答案",因为他们大多采用相同的方法:
OnClickListener不适用于ViewPager中GridView中的第一项
基本上,每次调用getview时都要实例化视图.这对于性能很糟糕,并且它们可能会在许多设备中面临内存不足的问题.
在我的例子中,我在GridView中显示位于assets文件夹中的子文件夹内的图像.
我的原始代码带有"第一项"问题(实际上,我的原始代码实现了视图模式,但这个更简单并面临同样的问题):
@Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(_activity); } else { imageView = (ImageView) convertView; } // get screen dimensions AssetManager assetManager = _activity.getAssets(); InputStream assetIn = null; try { assetIn = assetManager.open(_assets_subdir + File.separator + _filePaths.get(position)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Bitmap image = BitmapFactory.decodeStream(assetIn); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth)); imageView.setImageBitmap(image); // image view click listener imageView.setOnClickListener(new OnImageClickListener(position)); return imageView; }
我的最终代码解决了这个问题:
@Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(_activity); imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth)); } else { imageView = (ImageView) convertView; } // get screen dimensions AssetManager assetManager = _activity.getAssets(); InputStream assetIn = null; try { assetIn = assetManager.open(_assets_subdir + File.separator + _filePaths.get(position)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Bitmap image = BitmapFactory.decodeStream(assetIn); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageBitmap(image); // image view click listener imageView.setOnClickListener(new OnImageClickListener(position)); return imageView; }
移动代码解决了这个问题imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));
.
但为什么?我不确定.
我在某处(在SO中)读到它可能正在发生,因为尝试访问尚未膨胀的视图,并且用户建议使用getViewTreeObserver()
,但我尝试了这种方法并且无法解决问题.
因此,我决定对代码进行试错,以查看瓶颈在哪里,并找到给定的解决方案.
任何人都知道为什么解决这个问题?