我已经有一个列表视图,其中包含从网址加载的图片。 我想在加载时在每个图像中添加类似旋转圆圈的内容。 现在,我使用i default作为加载之前加载的图像的替代。 我在这里找到的主要是所有类都扩展了AsyncTask。嗯,我有这个:
我有一个解析json的Activity。 然后我有一个 MyCustomAdapter ,它扩展了BaseAdapter:
//constructor
public MyCustomAdapter (Context c, List<RowItem> items){
this.context = c;
this.sRowItems = items;
imageLoader=new ImageLoader(c.getApplicationContext());
}
.
.
.
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if(convertView == null){
convertView = inflater.inflate(R.layout.list_layout, null);
holder = new ViewHolder();
holder.txtName = (TextView) convertView.findViewById(R.id.name);
holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
holder.imageView = (ImageView) convertView.findViewById(R.id.prof_pic);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
RowItem sItem = (RowItem) getItem(position);
holder.txtName.setText(sItem.getShopName());
holder.txtDesc.setText(sItem.getShopDesc());
imageLoader.DisplayImage(sItem.getImageUrl(), holder.imageView);
return convertView;
}
然后我有我的图像加载器类。因此,我使用普通的java线程而不是AsyncTask。 部分原因是:
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
final int stub_id=R.drawable.ic_launcher;
public void DisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
我在stackoverflow中看到了使用
的答案ProgressDialog mDialog = new ProgressDialog(getApplicationContext());
但是当我将它放在我的ImageLoader类中时,它无法使用我的代码。 我很难实现这个加载动画圈。 请帮忙。非常感谢。
答案 0 :(得分:4)
在每个列表项中都有一个进度条。每当您下载图像时,请隐藏此进度条[设置可见性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>
此外,我还有一个文本视图,显示下载是否失败,在您的情况下,如果下载失败,您可以删除此文本视图并显示默认图像并隐藏进度条。
答案 1 :(得分:0)
在执行前执行:
ProgressDialog pd= new ProgressDialog(getApplicationContext());
pd.setMessage("Please wait while Image lis being loaded");
pd.show();
在doInBackground()中:
pd.setMessage("Downloading image ....");
postExecute中的:
pd.setMessage("");
pd.dismiss();