[英]Android ListView ArrayAdapter
I'm trying to use a lazylist to load my images and I'm using an array for my datas. 我正在尝试使用惰性列表来加载图像,并且正在使用数组存储数据。 But I cant figure out how to implement it into my view holder.
但是我不知道如何在我的视图持有者中实现它。 Please check my codes below.
请在下面检查我的代码。 this line of code
这行代码
imageLoader.DisplayImage(worldpopulationlist.get(position).getFlag(), holder.flag);
The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView) 类型为ImageLoader的方法DisplayImage(String,ImageView)不适用于参数(int,ImageView)
ListViewAdapter ListViewAdapter
public class ListViewAdapter extends BaseAdapter {
// Declare Variables
Context mContext;
LayoutInflater inflater;
private List<WorldPopulation> worldpopulationlist = null;
private ArrayList<WorldPopulation> arraylist;
ImageLoader imageLoader;
public ListViewAdapter(Context context, List<WorldPopulation> worldpopulationlist) {
mContext = context;
this.worldpopulationlist = worldpopulationlist;
inflater = LayoutInflater.from(mContext);
this.arraylist = new ArrayList<WorldPopulation>();
this.arraylist.addAll(worldpopulationlist);
imageLoader = new ImageLoader(mContext);
}
public class ViewHolder {
TextView rank;
TextView country;
TextView population;
ImageView flag;
}
@Override
public int getCount() {
return worldpopulationlist.size();
}
@Override
public WorldPopulation getItem(int position) {
return worldpopulationlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.listview_item, null);
holder.rank = (TextView) view.findViewById(R.id.rank);
holder.country = (TextView) view.findViewById(R.id.country);
holder.population = (TextView) view.findViewById(R.id.population);
holder.flag = (ImageView) view.findViewById(R.id.flag);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.rank.setText(worldpopulationlist.get(position).getRank());
holder.country.setText(worldpopulationlist.get(position).getCountry());
holder.population.setText(worldpopulationlist.get(position).getPopulation());
//holder.flag.setImageResource(worldpopulationlist.get(position).getFlag());
imageLoader.DisplayImage(worldpopulationlist.get(position).getFlag(), holder.flag);
Imageloader 图像加载器
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
private Map<ImageView, String> imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(Context context) {
executorService = Executors.newFixedThreadPool(5);
}
final int tempimage = R.drawable.temp_image;
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(tempimage);
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = new File(url);
Bitmap b = decodeFile(f);
if (b != null) {
return b;
}
return null;
}
// Decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
// Find the correct scale value. It should be the power of 2.
// Recommended Size 512
final int REQUIRED_SIZE = 512;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
@Override
public void run() {
try {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
} catch (Throwable th) {
th.printStackTrace();
}
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(tempimage);
}
}
public void clearCache() {
memoryCache.clear();
}
}
Worldpopulation 世界人口
public class WorldPopulation {
private String rank;
private String country;
private String population;
private int flag;
public WorldPopulation(String rank, String country, String population,
int flag) {
this.rank = rank;
this.country = country;
this.population = population;
this.flag = flag;
}
public String getRank() {
return this.rank;
}
public String getCountry() {
return this.country;
}
public String getPopulation() {
return this.population;
}
public int getFlag() {
return this.flag;
}
}
as you are getting 随着你越来越
The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView)
类型为ImageLoader的方法DisplayImage(String,ImageView)不适用于参数(int,ImageView)
means worldpopulationlist.get(position).getFlag()
returning an integer value instead of an image url. 表示
worldpopulationlist.get(position).getFlag()
返回一个整数值而不是图像url。 so make sure you are using right getter/setter for image url. 因此,请确保您使用正确的getter / setter作为图片网址。
ImageLoader.DisplayImage(String,ImageView)
method takes two parameter first as String url for image and second is imageView instance to which you want to set downloaded image ImageLoader.DisplayImage(String,ImageView)
方法采用两个参数,第一个是图像的String url,第二个是要设置下载图像的imageView实例。
imageLoader.DisplayImage(imageurl, imageview);
The display method takes a String URL and a ImageView as the parameter. display方法使用String URL和ImageView作为参数。
In your case "The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView)" indicating you have passed a int and a imageview. 在您的情况下,“ ImageLoader类型的DisplayImage(String,ImageView)方法不适用于参数(int,ImageView)”,表明您已传递int和imageview。
Pass a string URL of the image as the first parameter and imageview as the second 传递图像的字符串URL作为第一个参数,并传递imageview作为第二个参数
For more information check the documentation @ https://github.com/nostra13/Android-Universal-Image-Loader 有关更多信息,请查看文档@ https://github.com/nostra13/Android-Universal-Image-Loader
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.