我正在使用包含3个字段,1个imageview和2个textview的列表视图。我正在解析listview的json数据。当我滚动列表视图时,图像视图中的图像会发生变化,然后当我向后滚动到顶部时,它会再次发生变化。我正在显示网址中的图片。
以下是一些代码:
public ArrayList<HashMap> dataToList(List<CatalogTopCategory> detailsList) {
list = new ArrayList<HashMap>();
for (CatalogTopCategory catalogTopCategory : detailsList) {
HashMap temp = new HashMap();
temp.put(FIRST_COLUMN, catalogTopCategory.getCategoryName());
temp.put(SECOND_COLUMN, catalogTopCategory.getCategoryDesc());
temp.put(THIRD_COLUMN, catalogTopCategory.getCategoryBannner());
temp.put(FIFTH_COLUMN, catalogTopCategory.getCategoryThumbnail());
temp.put(FORTH_COLUMN, catalogTopCategory.getCategoryId());
list.add(temp);
}
return list;
}
final ArrayList<HashMap> hashMaps = dataToList(storeCatList);
catalogTopAdapter = new CatalogTopAdapter(StoreLanding.this,
hashMaps, getApplicationContext());
listView.setAdapter(catalogTopAdapter);
以下是适配器类代码:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = activity.getLayoutInflater();
if (convertView == null)
{
convertView = inflater.inflate(R.layout.catalog_listview, null);
holder = new ViewHolder();
holder.imageView = (ImageView)convertView.findViewById(R.id.imageView2);
holder.txtFirst = (TextView) convertView.findViewById(R.id.FirstText);
holder.txtSecond = (TextView) convertView.findViewById(R.id.SecondText);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Typeface type = Typeface.createFromAsset(mContext.getAssets(),"fonts/FeedSpeedFonts.otf");
holder.txtFirst.setTypeface(type);
holder.txtSecond.setTypeface(type);
HashMap map = list.get(position);
new LoadImage(holder.imageView).execute(String.valueOf(map.get(FIFTH_COLUMN)));
holder.txtFirst.setText((CharSequence) map.get(FIRST_COLUMN));
holder.txtSecond.setText((CharSequence) map.get(SECOND_COLUMN));
convertView.setTag(holder);
return convertView;
}
加载图片:
private class LoadImage extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public LoadImage(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon = null;
try {
mIcon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.default_image);
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(Bitmap.createScaledBitmap(result, 100, 100,
false));
}
}
答案 0 :(得分:2)
此new LoadImage(holder.imageView).execute(String.valueOf(map.get(FIFTH_COLUMN)));
导致刷新图片时出现问题。在刷新视图时,您将启动asynctask evry time。当您的视图将被重用时,您的asynck任务会在位置上显示错误的图像,因此您的asynctask会再次启动并显示良好的图像。您无法以这种方式设置图像。 Android社区使用
答案 1 :(得分:0)
我建议您使用picasso库来简化图像下载过程。 Picasso是开源的,是Android中广泛使用的图像下载程序库之一。你从link
下载它只需使用getView()方法中的以下代码段替换您的图像下载。
Picasso.with(this)
.load("YOUR IMAGE URL HERE")
.placeholder(R.drawable.ic_placeholder) // optional
.error(R.drawable.ic_error_fallback) // optional
.into(imageView);
这可能不是您的问题的解决方案,而是替代方案。
答案 2 :(得分:0)
您可以使用 Volley 库 NetworkImageView 。感谢免费提及此链接Volley Networkimageview example