在我的应用程序中,我有一个listView
使用LazyLoading来显示图像的程序。
但是在下载并显示实际图像之前,我希望ImageView
显示加载动画而不是一些默认图像。
我想创建一个imageView
具有默认图像的自定义,ListDrawable
它看起来像一个动画。但是有没有更简单/通用的方法来实现这一点?
谢谢你。
这是一个相当普遍的问题,可以通过使用其中一个可用的库来解决。当我需要类似的东西时,图书馆感觉有点沉重。
一个非常简单的解决方案是使用默认加载微调器创建 ImageView。现在你有一个充满微调器的 ListView。接下来创建一个新的 AsyncTask 类,它接受一个 URL 并返回一个位图。当 Async 任务完成时,使用myImageView.setImageBitmap(...);
. 例如(没有合理的错误检查等)
public class MyLazyBitmapLoader extends AsyncTask<String, Void, Bitmap> {
private ImageView imageView;
public MylazyBitmapLoader(final ImageView imageView) {
this.imageView = imageView;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap result = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
result = BitmapFactory.decodeStream(in);
}
catch (Exception e) {
...
}
return result;
}
protected void onPostExecute(Bitmap result) {
//handle null
imageView.setImageBitmap(result);
}
}
这可以很容易地扩展到包括其他功能,例如缓存、其他资源加载等
在每个列表项中都有一个进度条。每当您下载图像时,隐藏此进度条[设置可见性 GONE]。你的 xml 应该看起来有点像
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imgToBeSet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:contentDescription="@string/img_cont_desc_common" />
<ProgressBar
android:id="@+id/imgProgress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imgToBeSet"
android:layout_centerHorizontal="true"
android:visibility="gone"
android:text="@string/msg_download_failed" />
</RelativeLayout>