Android GridView+;游标适配器+;异步任务加载图像随机移动

Android GridView+;游标适配器+;异步任务加载图像随机移动,android,gridview,android-asynctask,simplecursoradapter,Android,Gridview,Android Asynctask,Simplecursoradapter,我使用SimpleCursorAdapter和GridActivity(我基于ListActivity编写的扩展活动)从MediaStore加载音乐相册,并使用AsyncTask加载每个相册艺术 我在bindView或getView中尝试过这个,如下所示: 新建AsyncAlbumArtLoader(viewholder.album\u艺术,mShowFadeAnimation)。执行(辅助、宽度、高度); 类异步AlbumArtLoader: 私有类AsyncAlbumArtLoader扩展

我使用SimpleCursorAdapter和GridActivity(我基于ListActivity编写的扩展活动)从MediaStore加载音乐相册,并使用AsyncTask加载每个相册艺术

我在
bindView
getView
中尝试过这个,如下所示:

新建AsyncAlbumArtLoader(viewholder.album\u艺术,mShowFadeAnimation)。执行(辅助、宽度、高度);
异步AlbumArtLoader

私有类AsyncAlbumArtLoader扩展了AsyncTask{
布尔值enable_animation=false;
私人影像视图;
公共AsyncAlbumArtLoader(图像视图、布尔动画){
启用动画=动画;
this.imageview=imageview;
}
@凌驾
受保护的void onPreExecute(){
如果(启用_动画){
imageview.startAnimation(AnimationUtils.loadAnimation(getApplicationContext()),
android.R.anim.fade_out);
imageview.setVisibility(视图.不可见);
}
}
@凌驾
受保护位图doInBackground(对象…参数){
返回MusicUtils.getCachedArtwork(getApplicationContext(),(Long)参数[0],
(整数)参数[1],(整数)参数[2];
}
@凌驾
受保护的void onPostExecute(位图结果){
如果(结果!=null){
设置图像位图(结果);
}否则{
imageview.setImageResource(R.drawable.albumart\u mp\u未知\u列表);
}
如果(启用_动画){
设置可见性(View.VISIBLE);
imageview.startAnimation(AnimationUtils.loadAnimation(getApplicationContext()),
android.R.anim.fade_in);
}
}
}
但是图像在gridview项目之间随机移动

您可以看到屏幕录制视频

编辑通过setTag()防止此错误,getTag()也无效

@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
移动位置(位置);
ViewHolder ViewHolder=(ViewHolder)view.getTag();
String album_name=mAlbumCursor.getString(mAlbumIndex);
if(相册名称==null | | MediaStore.UNKNOWN_STRING.equals(相册名称)){
viewholder.album\u name.setText(R.string.unknown\u album\u name);
}否则{
viewholder.album_name.setText(album_name);
}
字符串艺术家_name=mAlbumCursor.getString(mArtistIndex);
if(相册名称==null | | MediaStore.UNKNOWN_STRING.equals(相册名称)){
viewholder.artist\u name.setText(R.string.unknown\u artist\u name);
}否则{
viewholder.artist_name.setText(artist_name);
}
//我们实际上不需要缩略图文件的路径,
//我们只是用它来看看是否有专辑艺术
long-aid=mAlbumCursor.getLong(malbumididex);
int width=getResources().getDimensionPixelSize(R.dimen.gridview\u位图\u width);
int height=getResources().getDimensionPixelSize(R.dimen.gridview\u bitmap\u height);
viewholder.album_art.setTag(辅助);
新的AsyncAlbumArtLoader(viewholder.album_艺术、mShowFadeAnimation、aid、宽度、高度)。执行();
long currentalbumid=MusicUtils.getCurrentAlbumId();
如果(currentalbumid==aid){
viewholder.album_name.SetCompoundDrawablesWithinInstincBounds(0,0,
R.可拉拔ic_指示器_Now Playing_small,0);
}否则{
viewholder.album_name.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);
}
返回视图;
}
//修复加载的图像有时不正确
私有类AsyncAlbumArtLoader扩展了AsyncTask{
布尔值enable_animation=false;
私人影像视图;
私人长相册id;
私人int宽度、高度;
公共AsyncAlbumArtLoader(ImageView ImageView、布尔动画、长相册id、整数宽度、整数高度){
启用动画=动画;
this.imageview=imageview;
this.album\u id=album\u id;
这个。宽度=宽度;
高度=高度;
}
@凌驾
受保护的void onPreExecute(){
if(imageview.getTag()==null | |(长)imageview.getTag()!=album|id){
返回;
}
如果(启用_动画){
imageview.startAnimation(AnimationUtils.loadAnimation(getApplicationContext()),
android.R.anim.fade_out);
imageview.setVisibility(视图.不可见);
}
}
@凌驾
受保护位图doInBackground(对象…参数){
if(imageview.getTag()==null | |(长)imageview.getTag()!=album|id){
返回null;
}
返回MusicUtils.getCachedArtwork(getApplicationContext(),唱片集id,
宽度、高度);
}
@凌驾
受保护的void onPostExecute(位图结果){
if(imageview.getTag()==null | |(长)imageview.getTag()!=album|id){
返回;
}
如果(结果!=null){
设置图像位图(结果);
}否则{
imageview.setImageResource(R.drawable.albumart\u mp\u未知\u列表);
}
如果(启用_动画){
设置可见性(View.VISIBLE);
imageview.startAnimation(AnimationUtils.loadAnimation(getApplicationContext()),
android.R.anim.fade_in);
}
}
}

问题是,异步任务不知道für哪个图像查看它们从哪里开始,它们各自重叠

要防止这种情况,您需要执行以下操作: 在您的
getView
方法中(在调用AsyncTask构造函数之前,您需要为您的ImageView设置一个标记:
myImageView.setTag(object)
。如果您使用getView从中获取其信息的对象,则最佳选择是
 if (imageview.getTag().toString().equals(tag)) {
// you got the right imageView, *your PostExecute Code* }
else {// wrong one, do nothing
}