我正在尝试加载图像在我的画廊从Url
使用延迟加载和一切工作正常。它显示一个ProgressBar
,直到图像加载,当图像从站点加载时消失。我已经尝试了所有的方式,但它跳过第一个图像加载,并按照我的要求完美地显示剩余的图像。我已经检查了日志,结果是getView
方法显示position
0
0
0
1
0
0
0
1
,如果我有两个图像,所以它不显示第一个图像,因为它同时调用三次,导致它在加载之前重新加载。所以我的问题是为什么它一次调用三次。我已经搜索了许多关于这方面的问题,但有序列是0
1
0
1
,这不是问题。为什么会发生这种情况?
下面是我的一些代码。
这是我的自定义ImageView
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class WebImageView extends ImageView {
private Drawable image;
private ProgressBar placeholder;
public WebImageView(Context context) {
super(context);
}
public WebImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public WebImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setPlaceholderImage(int resid) {
View view = (View)this.getParent();
placeholder = (ProgressBar)view.findViewById(resid);
if (image == null) {
placeholder.setVisibility(View.VISIBLE);
}
}
@SuppressWarnings("deprecation")
public void setIt(Bitmap result){
image = new BitmapDrawable(result);
if (image != null) {
try{Thread.sleep(2000);}catch(Exception e){}
placeholder.setVisibility(View.GONE);
setImageDrawable(image);
}
}
}
我的CustomAdapter
。
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.smartsync.ImageCache;
import com.smartsync.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class ImageAdapter extends ArrayAdapter<URL> {
private Activity activity;
private int layoutResourceId;
private ArrayList<URL> data = new ArrayList<URL>();
ExecutorService exec;
private ImageCache cache;
public ImageAdapter(Context context, int layoutResourceId, ArrayList<URL> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.activity = (Activity)context;
exec = Executors.newSingleThreadExecutor();
this.data = data;
this.cache = new ImageCache(context);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
final URL url = data.get(position);
final WebImageView image;
if (row == null) {
row = activity.getLayoutInflater().inflate(layoutResourceId, parent, false);
image = (WebImageView) row.findViewById(R.id.webimage);
image.setPlaceholderImage(R.id.pbar);
this.notifyDataSetChanged();
row.setTag(image);
}
else
image = (WebImageView) row.getTag();
final ImageAdapter adapter = this;
/*if(position == 0){
row.setVisibility(View.GONE);
return row;
}*/
exec.execute(new Runnable(){
@Override
public void run() {
try {
Bitmap bitmap = null;
bitmap = cache.getBitmap(url);
if(bitmap == null){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
options.outHeight = 100;
options.outWidth = 100;
options.inSampleSize = 5;
bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options);
cache.setCache(bitmap, url);
}
final Bitmap bmp = bitmap;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
image.setIt(bmp);
adapter.notifyDataSetChanged();
}
});
} catch (Exception e) {
Log.i("test", ""+e);
}
}
});
return row;
}
}
这是单行的布局。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="vertical"
android:padding="5dp"
android:clickable="true"
android:focusable="true">
<com.smartsync.adapters.WebImageView
android:id="@+id/webimage"
android:background="@xml/border"
android:cropToPadding="true"
android:scaleType="centerCrop"
android:padding="3dip"
android:adjustViewBounds="true"
android:layout_width="100dp"
android:layout_height="100dp" />
<ProgressBar
android:id="@+id/pbar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
请告诉我如何解决这个问题。我已经搜索了关于这个职位问题的所有问题,但都无法解决这个问题。
我自己又找到了原因。问题是我在getView()
中调用this.notifyDataSetChanged();
,这导致再次绘制,因此开始加载自身导致问题。我刚刚去掉了这条线。我不需要这个,因为这一行是在我们改变数据集的数量时使用的,但在我的例子中,这些已经加载了。删除进度条和加载图像不是这一行的任务。