Android ListView加载图片很卡的问题,希望大神有办法帮我解决一下。
这是一个加载音乐图片的问题
下面是一个 adapter 的 getView 方法,在该方法中最后面 setImageBitmap 就是这里设置图片会导致listView滑动很卡。
然后我把 ImageManager 这个类贴出来,加载图片和默认图片的
下面是一个 adapter 的 getView 方法,在该方法中最后面 setImageBitmap 就是这里设置图片会导致listView滑动很卡。
@Override
public View getView(final int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
view = inflater.inflate(R.layout.list_view_music_item, null);
holder = new ViewHolder();
holder.tvMusicTitle = (TextView) view.findViewById(R.id.itemName);
holder.tvMusicDes = (TextView) view.findViewById(R.id.itemDetail);
holder.albumPic = (ImageView) view.findViewById(R.id.listView_albumPic);
holder.frm_menu_layout = (RelativeLayout) view.findViewById(R.id.frm_menu);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.frm_menu_layout.setOnClickListener(new MenuOnClickListener(position));
if (MyApplication.getCurrentMusic() != null &&
musics.get(position).getId() == MyApplication.getSharedPreferences()) {
view.setBackgroundResource(R.drawable.item_background);
} else {
view.setBackgroundColor(Color.WHITE);
}
holder.tvMusicTitle.setText(musics.get(position).getTitle());
holder.tvMusicDes.setText(musics.get(position).getArtist() + " - "
+ musics.get(position).getAlbum());
// 更新专辑图片
holder.albumPic.setTag(musics.get(position).getData());
holder.albumPic.setImageBitmap(ImageManager.loadMusicImage(activity,musics.get(position)));
return view;
}
然后我把 ImageManager 这个类贴出来,加载图片和默认图片的
/**
* 加载图片管理类
* @author Administrator
*
*/
public class ImageManager {
private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
public static Bitmap loadMusicImage(Context context, Music music) {
if(music == null){
//加载默认图片
return ImageUtil.readResourcesBitmap(context, R.drawable.default_album_identify);
}
return loadMusicImage(context, music, R.drawable.default_album_identify);
}
public static Bitmap loadMusicImage(Context context, Music music, int defaultImage) {
Bitmap bm = getArtwork(context, music.getId(), music.getAlbumId());
if (bm == null && defaultImage!=0) {
bm = ImageUtil.readResourcesBitmap(context, defaultImage);
}
return bm;
}
public static Bitmap getArtwork(Context context, long song_id, long album_id) {
if (album_id < 0) {
if (song_id >= 0) {
Bitmap bm = getArtworkFromFile(context, song_id, -1);
if (bm != null) {
return bm;
}
}
return null;
}
ContentResolver res = context.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
if (uri != null) {
InputStream in = null;
try {
in = res.openInputStream(uri);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
return BitmapFactory.decodeStream(in, null, opt);
} catch (FileNotFoundException ex) {
Bitmap bm = getArtworkFromFile(context, song_id, album_id);
if (bm != null) {
if (bm.getConfig() == null) {
bm = bm.copy(Bitmap.Config.RGB_565, false);
}
}
return bm;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
}
}
}
return null;
}
private static Bitmap getArtworkFromFile(Context context, long songid,long albumid) {
Bitmap bm = null;
if (albumid < 0 && songid < 0) {
throw new IllegalArgumentException("Must specify an album or a song id");
}
try {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
if (albumid < 0) {
Uri uri = Uri.parse("content://media/external/audio/media/"+ songid + "/albumart");
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd, null, opt);
}
} else {
Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd, null, opt);
}
}
} catch (FileNotFoundException ex) {
}
return bm;
}
}
...全文
相关推荐
实现ListView的异步加载,图片的本地缓存,以及手势识别
例如,在ListView中,我们可能希望在用户快速上滑时加载更多数据。
Android ListView控件显示数据库中图片
本文总结了 Android ListView 控件显示数据库中图片的过程,涉及到 SimpleAdapter、ViewBinder、数据库操作、ListView 控件的点击事件、图片的显示等知识点,希望对读者有所帮助
安卓 listview 异步读取url图片
在安卓开发中,ListView 是一个常用的组件,用于展示大量数据列表。然而,如果直接在 ListView 中加载网络图片,可能会导致性能问题,如界面卡顿、内存溢出等。
Android实现ListView异步加载图片
为了解决这个问题,我们需要将图片加载工作放到后台线程进行,这就是异步加载图片的基本思想。
android ListView异步加载图片和优化
为了解决这个问题,可以使用异步加载技术,如Universal Image Loader、Picasso、Glide等库。这些库支持在后台线程下载图片,并将其缓存到内存或磁盘,然后在需要时快速显示。


