我正在使用智能图像视图从互联网下载图像。我把图像放在一个列表视图,它工作得很好,问题开始时,我滚动,应用程序查看以前的图像,过了一段时间,它显示了正确的图像,我想,它不会显示任何东西,直到正确的图像准备好了,我怎么能做到这一点?
import java.util.ArrayList;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.loopj.android.image.SmartImageView;
public class ListAdapter extends BaseAdapter{
Activity context;
ArrayList<Row> List ;
public ListAdapter(ArrayList<Row> List, Activity context) {
this.List = List;
this.context = context;
}
@Override
public int getCount() {
return List.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null){
convertView = inflater.inflate(R.layout.custom_row, parent, false);
holder = new ViewHolder();
holder.image = (SmartImageView) convertView.findViewById(R.id.image);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
String Name = List.get(position).getName();
String image = List.get(position).getURL();
holder.name.setText(Name);
holder.image.setImageUrl(image);
return convertView;
}
static class ViewHolder {
TextView name;
SmartImageView image;
}
}
这是因为Android中的listview被重用来帮助提高性能。SmartImageView的setImageUrl
方法需要一些时间来完成,直到它完成
您可以通过在holder.image.setImageUrl(image);
holder.image.setImageBitmap(null);
问题是下一页上的图像尚未加载,但第一页的图像正在加载。ListAdapter在内部重用视图,这意味着它有固定数量的不同内容的视图(通过public View getView(int position, View convertView, ViewGroup parent
)。
因此,当新图片尚未下载时,SmartImageView不幸不够智能,无法用占位符替换以前的内容:)
但是你可以使用下面的方法,而不是看到错误的图片:
public void setImageUrl(
String url,
final Integer fallbackResource,
final Integer loadingResource)
。
holder.image.setImageUrl(
image,
R.drawable.my_fallback_drawable,
R.drawable.my_placeholder_drawable);