首先,是的,我知道这个question,但答案对我没有帮助。是的,它解决了“滚动时改变位置”的问题,但它不是我问题的最佳解决方案。让我解释一下......
所以,这是我的 getView :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
UnscaledImageView imageView;
if(convertView == null) {
imageView = new UnscaledImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setImageResource(mThumbIds[position]);
} else {
imageView = (UnscaledImageView)convertView;
}
return imageView;
}
通常的解决方案是将imageView.setImageResource(mThumbIds[position]);
移到if
语句之外和之下。但这造成了另一个问题......
您可能已经注意到我使用的是UnscaledImageView
而不是ImageView
。这是ImageView
的自定义子类,我在其中重写了setImageResource()
方法,手动解码位图,并提供了一些额外的选项以满足我的需求。手动解码是造成我问题的原因。
如果setImageResource()
方法保留在if
内,没问题,位图解码将针对位图进行一次(在GridView加载期间)并且滚动将是平滑的...... 但每个卷轴都会跳转到不同的位置。
但是如果setImageResource()
方法停留在if
之外,图像将不会跳转到不同的位置,但每个滚动都会不断解码所有图像。 滚动会生涩而根本不光滑。
我该如何解决这个问题?有什么想法吗?
答案 0 :(得分:1)
也许您可以对解码图像使用某种缓冲或缓存。您的setImageResource
方法应该检查其输入图像是否已经在缓冲区中(即,它是否已经被解码)。如果是这样,那么您的方法只是从缓冲区中检索解码图像。如果没有,那么它将解码图像并将其存储在缓冲区中以供将来使用。如何实现缓冲区/缓存取决于您自己的需求。我相信有很多可能性。这样,您可以将setImageResource
的调用移出if-then
块,并且无需在每次调用getView
方法时解码图像。