我想实现到与底座适配器和LruCache的帮助下所有接触图像列表视图。 但在屏幕上的所有图像(对应于该视图)长卷在设置实际的图像之前显示。
例如:每页5个项目,如果我们从第一次接触到第60位,上1,6,11,16,21..51列表视图图像的第一个视图滚动列表视图中显示几毫秒的55图像前如图
主代码
//Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if(imageView == null){
imageView = new ImageView(getActivity());
}
int id = contactId[position];
final String imageKey = String.valueOf(contactId);
final Bitmap bitmap = cache.get(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Resources res = context.getResources();
BitmapManager bm = new BitmapManager(imageView, res, cache);
bm.setContext(getActivity());
bm.execute(id);
}
return imageView;
}
BitmapManager邮执行代码
@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
try{
if(isCancelled()){
bitmap = null;
}
if(imageViewReference != null && bitmap != null){
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
cache.put(String.valueOf(res), bitmap);
if(imageView != null){
imageView.setImageBitmap(bitmap);
}
}
}catch(Exception e){
}
super.onPostExecute(bitmap);
}
如何解决这个问题呢。 谢谢
当你向下滚动,你的观点得到重用对于映入眼帘的新列表中的位置。 既然你每个getView调用时开始一个新的BitmapManager任务,任务得到一字排开,等待更新图像。 当他们每完成加载其位,他们把它放到ImageView的才能,这是你所看到的。
它看起来像你试图用一个参考的ImageView避免使用位图它滚出视后,但没有工作的原因是适配器回收利用ImageViews,所以参考保持有效,即使在现实中的ImageView被用于不同的列表项现在。
有不同的方法来解决这个问题,但我想到的最简单的就是用一个列表索引,而不是本身的ImageView来构建你的BitmapManager。 然后在getView你可以保持地图的什么什么位置正在使用的意见。 当BitmapManager完成后,检查是否有针对你刚刚加载到缓存位置上的电流ImageView的。 如果没有,那么什么也不做。
下面是一些代码,显示了我说的。 我没有尝试,所以道歉,如果有错误。
//Adapter
private SparseArray<ImageView> ivMap = new SparseArray<ImageView>();
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if(imageView == null){
imageView = new ImageView(getActivity());
} else {
// If recycled, remove the ImageView's previous position from map
int oldPosition = ivMap.indexOfValue(imageView);
if (oldPosition >= 0) {
ivMap.remove(oldPosition);
}
}
// Keep track of which view is representing this position
ivMap.put(position, imageView);
int id = contactId[position];
final String imageKey = String.valueOf(contactId);
final Bitmap bitmap = cache.get(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Resources res = context.getResources();
BitmapManager bm = new BitmapManager(ivMap, position, res, cache);
bm.setContext(getActivity());
bm.execute(id);
}
return imageView;
}
//BitmapManager
@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
try{
if(isCancelled()){
bitmap = null;
}
if(bitmap != null){
cache.put(String.valueOf(res), bitmap);
ImageView imageView = ivMap.get(position);
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}catch(Exception e){
}
super.onPostExecute(bitmap);
}