【问题标题】:Images are changing in ListView while scrolling in Android在 Android 中滚动时,图像在 ListView 中发生变化
【发布时间】:2017-02-25 14:45:53
【问题描述】:

我在 ListView 中有一个 ImageView,ImageView 有一个默认图像,在渲染时,我异步下载图像并将它们加载到 ImageViews 中。它工作得很好,但是当我向下滚动两个项目并向后滚动时,第一行和第二行中的默认图像会更改为第六行和第七行的图像。

我阅读了这些主题,但没有找到解决方案。

Image change when i scroll gridview

My images changing during scroll in listview android

ListView images changing During Scroll

public class RssAdapter extends BaseAdapter {

private final List<SyndEntry> items;
private static Context context;
private static Map<String, Bitmap> mBitmapCache = new HashMap<String, Bitmap>();

public RssAdapter(Context context, List<SyndEntry> items) {
    this.items = items;
    this.context = context;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int id) {
    return id;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    if (convertView == null) {
        convertView = View.inflate(context, R.layout.rss_item, null);
        holder.itemTitle = (TextView) convertView.findViewById(R.id.itemTitle);
        holder.itemPubDate = (TextView) convertView.findViewById(R.id.itemPubDate);
        holder.itemImg = (ImageView) convertView.findViewById(R.id.itemImg);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.itemTitle.setText(items.get(position).getTitle());
    holder.itemPubDate.setText(items.get(position).getPublishedDate().toString());

    List<SyndEnclosure> encls = items.get(position).getEnclosures();
    if(!encls.isEmpty()){
        holder.imageUrl = encls.get(0).getUrl();
    }

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) {
        holder.setImage(holder.imageUrl);
    }

    return convertView;
}

private static class ViewHolder {
    TextView itemTitle;
    TextView itemPubDate;
    ImageView itemImg;
    String imageUrl;

    public void setImage(String imageUrl) {
        this.imageUrl = imageUrl;
        Bitmap imageBitmap = mBitmapCache.get(imageUrl);
        if(imageBitmap!=null){
            itemImg.setImageBitmap(imageBitmap);
        } else {
            AsyncHttpClient client = new AsyncHttpClient();
            client.get(imageUrl, null, fileHandler);
        }
    }

    FileAsyncHttpResponseHandler fileHandler = new FileAsyncHttpResponseHandler(context) {

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {

        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, File response) {
            Bitmap imageBitmap = BitmapFactory.decodeFile(response.getPath());
            itemImg.setImageBitmap(imageBitmap);
            mBitmapCache.put(imageUrl, imageBitmap);
        }
    };
}

我尝试设置一个布尔变量来检查我的图像是否已设置并且还尝试使用 SharedPreferences,但是当图像更改时我的这部分代码没有运行。

    if(!encls.isEmpty()){
        holder.imageUrl = encls.get(0).getUrl();
    }

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) {
        holder.setImage(holder.imageUrl);
    }

【问题讨论】:

  • 如果您需要在生产中实现它,我强烈建议您使用库(毕加索或滑翔)
  • 点击此链接,这将起作用See this link
  • @MilanPansuriya 谢谢,我以前读过,但没有帮助。

标签: java android listview imageview


【解决方案1】:

看来我终于解决了这个问题,我发布了未来的解决方案。所以,在这部分代码

} else {
    holder = (ViewHolder) convertView.getTag();
}

holder 对象不是必须为给定行呈现的对象。因此,我们必须将holder 对象的参数设置为所需的值。还可以,但是如果没有图像,我没有将图像相关参数设置为null。因此,缺少了两个 else 部分:

    if(!encls.isEmpty()){
        holder.imageUrl = encls.get(0).getUrl();
    } else {
        holder.imageUrl = null;
    }

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) {
        holder.setImage(holder.imageUrl);
    } else {
        holder.itemImg.setImageResource(R.mipmap.news_icon);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多