通用图像加载器在Android中加载时显示不同的图像
我正在使用通用图像加载器来显示来自web的listview图像。但在加载时,一个图像项目会显示其他图像项目。经过一段时间后,它完全加载它显示的确切图像。它有时看起来很尴尬 - 一个人显示另一个男人的照片。提前致谢。 我的适配器代码:通用图像加载器在Android中加载时显示不同的图像
公共类EmployeeAdapter延伸BaseAdapter实现的可筛选{
private ArrayList<EmployeeObj> mOriginalValues; // Original Values
private ArrayList<EmployeeObj> mDisplayedValues; // Values to be
private ImageLoader imageLoader; // displayed
LayoutInflater inflater;
public EmployeeAdapter(Context context,
ArrayList<EmployeeObj> mProductArrayList) {
this.mOriginalValues = mProductArrayList;
this.mDisplayedValues = mProductArrayList;
inflater = LayoutInflater.from(context);
imageLoader = ImageLoader.getInstance();
}
@Override
public int getCount() {
return mDisplayedValues.size();
}
@Override
public Object getItem(int position) {
return mDisplayedValues.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
LinearLayout llContainer;
TextView employeeName, employeeDesignation;
Button callButton;
ImageView imageView;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.employee_row, null);
holder.llContainer = (LinearLayout) convertView
.findViewById(R.id.searchListView);
holder.employeeName = (TextView) convertView
.findViewById(R.id.listTitle);
holder.employeeDesignation = (TextView) convertView
.findViewById(R.id.listDesignation);
holder.callButton = (Button) convertView
.findViewById(R.id.listButton);
holder.imageView = (ImageView) convertView
.findViewById(R.id.listImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
String addEmployeeName = mDisplayedValues.get(position)
.getEmployeeName();
if (addEmployeeName.length() >= 20) {
addEmployeeName = addEmployeeName.substring(0, 20);
addEmployeeName = addEmployeeName + ".....";
}
holder.employeeName.setText(addEmployeeName);
holder.employeeDesignation.setText(mDisplayedValues.get(position)
.getEmployeeDesignation());
// holder.employeeMobile.setText("01722761395");
// holder.employeeDesignation.setText(mDisplayedValues.get(position)
// .getEmployeeDesignation());
holder.callButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// Toast.makeText(getApplicationContext(), "Done",
// Toast.LENGTH_SHORT).show();
// int position=(Integer)adapter.
// Log.e("position==",position+"");
pos = position;
dialog.show();
}
});
String path = mDisplayedValues.get(position).getImagePath();
if (path.length() <= 5) {
} else {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheOnDisc().cacheInMemory().build();
imageLoader.displayImage(path, holder.imageView, options);
}
convertView.setBackgroundColor(position % 2 == 0 ? Color
.parseColor("#ffffff") : Color.parseColor("#ffffff"));
return convertView;
}
这是由于UIL重用的事实的ImageView时,他们不再被看到。假设您的屏幕可以同时显示3张图像,当顶部或底部图像不在屏幕上时(取决于向上或向下滚动),图像视图将被重新使用以加载您将显示的下一幅图像。
所以,如果你已经配置UIL加载新图像的同时加载3图像,你会选择旧的,因为imageView被重用。所以最好的办法是设置一些足够大的加载图像,以便UIL有时间在加载新图像之前加载它们。
不知道我是否足够清楚。告诉我你是否需要更多的解释。
编辑:
您需要通过调用threadPoolSize()
设置图像的最大数量要加载设置池的大小。
public class testApplication extends Application {
Context mContext;
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.delayBeforeLoading(0)
.resetViewBeforeLoading(true)
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)
.denyCacheImageMultipleSizesInMemory()
.defaultDisplayImageOptions(options)
.diskCacheExtraOptions(480, 320, null)
// .memoryCacheSize(41943040)
.threadPoolSize(10)
.build();
ImageLoader.getInstance().init(config);
}
}
在上面的例子中,我加载了10张图片(即使10张图片没有同时显示)。
另一件事,如果你真的不希望旧图像显示在新的加载之前,你可以在您的DisplayImageOptions
设置.resetViewBeforeLoading(true)
。
最后。如果你得到out of memory error
,read this(点4)
的问题感谢您的解释。我意识到这一点。但我怎样才能设置图像的数量加载? –
.resetViewBeforeLoading(true)对我来说是完美的解决方案。谢谢哥们... – Nitin
请分享一些代码! – QAMAR
显示您的适配器代码 –
Brother我已编辑添加适配器代码 –