首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在游标适配器中使用albumArt加载AsyncTask

如何在游标适配器中使用albumArt加载AsyncTask
EN

Stack Overflow用户
提问于 2017-01-16 16:06:22
回答 1查看 294关注 0票数 0

在检索albumArt并使用游标适配器中的AsyncTask将该艺术设置为ImageView时,我遇到了问题。当我打开我的应用程序时,它看起来如下:

然后我向下滚动列表,一切都很好(如果我滚动列表不是很快的话):

然后我滚动列表返回到非常乞讨(不是很快),它看起来也很好:

我想,我可能做错了什么,所以我有疑问:

是否有可能以某种方式解决这个问题,我已经尝试过许多不同的方法来实现AsyncTask并使其正常工作,但最终它看起来总是一样的。

下面是游标适配器的代码:

代码语言:javascript
复制
public class AllSongsCursorAdapter extends CursorAdapter {

public AllSongsCursorAdapter(Context context, Cursor cursor) {
    super(context, cursor, 0);
}

public boolean isCheckBoxVisible;
private AddToFavouritesArray favouritesArray = AddToFavouritesArray.getInstance();

private static class ViewHolder {
    CheckBox checkBox;
    TextView title;
    TextView artist;
    ImageView albumArt;

    private ViewHolder(View view) {

        checkBox = (CheckBox) view.findViewById(R.id.favouritesCheckBox);
        title = (TextView) view.findViewById(R.id.title);
        artist = (TextView) view.findViewById(R.id.artist);
        albumArt = (ImageView) view.findViewById(R.id.albumArt);
    }
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
    View view = LayoutInflater.from(context).inflate(R.layout.song_item, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(view);
    view.setTag(viewHolder);
    return view;
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {

    final ViewHolder viewHolder = (ViewHolder) view.getTag();
    if (isCheckBoxVisible) {
        viewHolder.checkBox.setVisibility(View.VISIBLE);
    } else {
        viewHolder.checkBox.setVisibility(View.GONE);
    }

    final int position = cursor.getPosition();
    viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

            if (b) {
                favouritesArray.integerArray.add(position);

            } else {
                favouritesArray.integerArray.remove(Integer.valueOf(position));
            }
        }
    });

    int songTitle = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
    int songArtist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);

    String currentTitle = cursor.getString(songTitle);
    String currentArtist = cursor.getString(songArtist);

    viewHolder.title.setText(currentTitle);
    viewHolder.artist.setText(currentArtist);

    //__________________________ALBUM_ART_______________________________________________________

    viewHolder.albumArt.setTag(cursor.getPosition());

    new AsyncTask<ViewHolder, Void, Bitmap>(){

        private ViewHolder viewHolder;

        @Override
        protected Bitmap doInBackground(ViewHolder... viewHolders) {
            viewHolder = viewHolders[0];
            int id = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
            long songId = cursor.getLong(id);

            Bitmap albumArt = getAlbumId(context, songId);
            return albumArt;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if(bitmap != null) {
                viewHolder.albumArt.setImageBitmap(bitmap);
            }else{
                viewHolder.albumArt.setImageResource(R.drawable.placeholder);
            }
        }
    }.execute(viewHolder);
}

private Bitmap getAlbumId(Context context, long id) {

    Bitmap albumArt = null;
    String selection = MediaStore.Audio.Media._ID + " = " + id + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{
                    MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ALBUM_ID},
            selection, null, null);
    if (cursor.moveToFirst()) {
        long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

        albumArt = getAlbumArt(context, albumId);
    }
    cursor.close();
    return albumArt;

}

private Bitmap getAlbumArt(Context context, long albumId) {

    Bitmap albumArt = null;
    String selection = MediaStore.Audio.Albums._ID + " = " + albumId + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, selection, null, null);

    if (cursor.moveToFirst()) {

        int art = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);

        String currentArt = cursor.getString(art);
        albumArt = BitmapFactory.decodeFile(currentArt);
    }
    cursor.close();
    return albumArt;
}

}

是的,当然,没有AsyncTask,除了滚动之外,一切都很好。提前谢谢你!

编辑

到头来,这就是它的工作原理。非常感谢你@ Orest Savchak,我对你的回答投赞成票和接受。非常感谢。//__________________________ALBUM_ART_______________________________________________________

代码语言:javascript
复制
    int id = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
    long songId = cursor.getLong(id);
    String string = getAlbumArtPath(context, songId);
    if(string!=null) {
        Picasso.with(context)
                .load(new File(string))
                .into(viewHolder.albumArt);
    }else{
        viewHolder.albumArt.setImageResource(R.drawable.placeholder);
    }
}
private String getAlbumArtPath(Context context, long id) {

    String selection = MediaStore.Audio.Media._ID + " = " + id + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{
                    MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ALBUM_ID},
            selection, null, null);
    if (cursor.moveToFirst()) {
        long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

        return getAlbumArt(context, albumId);
    }
    cursor.close();
    return null;

}

private String getAlbumArt(Context context, long albumId) {

    String selection = MediaStore.Audio.Albums._ID + " = " + albumId + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, selection, null, null);

    if (cursor.moveToFirst()) {

        int art = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);

        return cursor.getString(art);
    }
    cursor.close();
    return null;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 16:24:23

你应该自己管理你的任务。您的视图是可回收的,因此,对于不同的行只有一个视图,这会导致问题。大多数项目使用一些库,这些库为您自动完成--要容易得多,例如毕加索

代码语言:javascript
复制
Picasso.with(context).load(new File(getAlbumArtPath(context, songId))).into(viewHolder.albumArt);

private String getAlbumArtPath(Context context, long id) {

    String selection = MediaStore.Audio.Media._ID + " = " + id + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{
                    MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ALBUM_ID},
            selection, null, null);
    if (cursor.moveToFirst()) {
        long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

        return getAlbumArt(context, albumId);
    }
    cursor.close();
    return null;

}

private String getAlbumArt(Context context, long albumId) {

    String selection = MediaStore.Audio.Albums._ID + " = " + albumId + "";
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, selection, null, null);

    if (cursor.moveToFirst()) {

        int art = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);

        return cursor.getString(art);
    }
    cursor.close();
    return null;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41680446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档