在滚动列表视图上刷新图像

时间:2015-10-13 10:07:18

标签: android android-layout android-activity

我正在使用包含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));
    }
}

3 个答案:

答案 0 :(得分:2)

new LoadImage(holder.imageView).execute(String.valueOf(map.get(FIFTH_COLUMN)));导致刷新图片时出现问题。在刷新视图时,您将启动asynctask evry time。当您的视图将被重用时,您的asynck任务会在位置上显示错误的图像,因此您的asynctask会再次启动并显示良好的图像。您无法以这种方式设置图像。 Android社区使用

  • 毕加索
  • Universal Image Loader
  • Volley Image Loader
  • 滑翔

答案 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