我使用通用图像加载程序从网址加载大约50张图像 具有一些图像的列表图像具有960px×1378px的尺寸,并且一些图像具有1920px×1378px的尺寸 这是我的活页夹数据
public class BinderDataImg extends BaseAdapter {
static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;
public BinderDataImg() {
// TODO Auto-generated constructor stub
}
public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
this.imgHashmap = map;
inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
// TODO Auto-generated method stub
return imgHashmap.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.list_img, null);
holder = new ViewHolder();
holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);
vi.setTag(holder);
}
else{
holder = (ViewHolder)vi.getTag();
}
String uri = imgHashmap .get(position).get(KEY_IMG);
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.getInstance().displayImage(uri, holder.iv_img);
return vi;
}
static class ViewHolder{
ImageView iv_img;
}
}
这是活动中通用图像加载器的配置
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheOnDisc(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300)).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.memoryCache(new WeakMemoryCache())
.discCacheSize(100 * 1024 * 1024).build();
ImageLoader.getInstance().init(config);
所有图像都已加载,但向上或向下滚动时,图像向上或向下重新加载
和另一个问题
当屏幕垂直时,屏幕宽度使用图像尺寸960x1378
所有图像填充屏幕
但是当屏幕旋转到水平时,屏幕宽度使用图像1960x1378的尺寸和图像960x1378会变小
为什么 ?以及如何解决它
抱歉我的英语不好
谢谢你的阅读
答案 0 :(得分:0)
ListView
中每一行的视图都是可重用的,因此当您滚动填充行的正确数据时,适配器中的getView()
方法需要多次调用。这是ListView适配器的正常行为。您的getView()
电话会重新加载您的图片。
要理解为什么getView()
需要打电话,我建议你
- 您可以创建一个int []数组来保存图像已加载的位置
- 然后在getView()
检查图像是否已加载
- 如果已加载,则不加载
我希望结果是在滚动ListView之后,ListView的所有项目都是相同的
希望这个帮助
答案 1 :(得分:-1)
您每次都在 getView()中创建新实例:
您的更新代码:
public class BinderDataImg extends BaseAdapter {
static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;
ImageLoader imageLoader = ImageLoader.getInstance();
public BinderDataImg() {
// TODO Auto-generated constructor stub
}
public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
this.imgHashmap = map;
inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
// TODO Auto-generated method stub
return imgHashmap.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.list_img, null);
holder = new ViewHolder();
holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);
vi.setTag(holder);
}
else{
holder = (ViewHolder)vi.getTag();
}
String uri = imgHashmap .get(position).get(KEY_IMG);
imageLoader.displayImage(uri, holder.iv_img);
return vi;
}
static class ViewHolder{
ImageView iv_img;
}
}
希望这会对你有所帮助。