我想在我的ListView
中显示资源目录中的图像(所有这些图像都以png格式保存),但它非常滞后。我是一个完整的菜鸟,所以我需要帮助处理异步任务以消除滞后。
public class MyListAdapter extends ArrayAdapter < SettingsItem > {
Context context;
List < SettingsItem > items;
public MyListAdapter(Context context, int resource, List < SettingsItem > objects) {
super(context, resource, objects);
this.context = context;
items = objects;
}
@Override
public View getView(int position, View itemView, ViewGroup parent) {
ViewHolder holder;
if (itemView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
itemView = inflater.inflate(R.layout.settings_items, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) itemView.findViewById(R.id.item_icon);
holder.textView = (TextView) itemView.findViewById(R.id.item_text);
itemView.setTag(holder);
} else {
holder = (ViewHolder) itemView.getTag();
}
SettingsItem settingsItem = items.get(position);
if (settingsItem != null) {
holder.textView.setText(settingsItem.getName());
new ImageDownloaderTask(holder.imageView, getContext(), settingsItem.getIcon_id()).execute();
}
return itemView;
}
static class ViewHolder {
ImageView imageView;
TextView textView;
}
}
public class SettingsItem{
private String name;
private int icon_id;
public SettingsItem(String a, int b){
super();
name=a;
icon_id=b;
}
public String getName() {
return name;
}
public int getIcon_id() {
return icon_id;
}
}
class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
Context context;
int id;
public ImageDownloaderTask(ImageView imageView, Context context, int id) {
imageViewReference = new WeakReference<ImageView>(imageView);
this.context=context;
this.id=id;
}
@Override
protected Bitmap doInBackground(String... params) {
return BitmapFactory.decodeResource(context.getResources(),id );
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
imageView.setImageResource(R.drawable.medical_bag);
}
}
}
}
}
我真的需要一些帮助。
提前致谢。 :)
答案 0 :(得分:4)
我建议您使用Glide库,这会为您的应用中的图片加载带来性能,并且非常易于使用。 它还支持提取,解码和显示视频静止图像,图像和动画GIF。
它可以使任何类型的图像列表尽可能平滑和快速地滚动,但Glide对于您需要获取,调整大小和显示远程图像的几乎任何情况都是有效的。
Glide是一种快速高效的开源媒体管理和图像 Android的加载框架包装媒体解码,内存和 磁盘缓存,资源池化成简单易用 接口
将Glide添加到您的项目中:
dependencies {
compile 'com.github.bumptech.glide:glide:3.6.0'
compile 'com.android.support:support-v4:19.1.0'
}
对于列表视图,官方页面的用法如下:
@Override
public View getView(int position, View recycled, ViewGroup container) {
final ImageView myImageView;
if (recycled == null) {
myImageView = (ImageView) inflater.inflate(R.layout.my_image_view,
container, false);
} else {
myImageView = (ImageView) recycled;
}
String url = myUrls.get(position);
Glide.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);
return myImageView;
}
供参考使用此库以加快图像加载和更好滚动的另一个项目:https://github.com/chrisbanes/cheesesquare
答案 1 :(得分:3)
要在应用中创建复杂列表,您可以使用RecyclerView。在https://developer.android.com/training/material/lists-cards.html中阅读有关回收者视图的更多信息。
要显示图像,请使用滑行。 https://github.com/bumptech/glide。它是一个很棒的库,可以为您完成所有内存管理。在imageview中加载位图有点痛苦。
答案 2 :(得分:2)
您可以使用缓存来加快显示速度。我正在使用毕加索http://square.github.io/picasso,这对于轻松显示图片和处理缓存非常有用。希望它有所帮助。
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);