ListView自定义适配器丢失imageView

亚麻渣

我有一个片段,显示帖子列表。列表中的项目是自定义的,并且有一个ImageView,可以放置从Internet(通过URL)下载的图像。

问题是下载的图像转到错误的项目(有时会重复出现在两个或多个项目中)。

package com.shoozy.app.utils;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.shoozy.app.R;
import com.shoozy.app.data.Post;

import java.util.ArrayList;

public class PostAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;

    ArrayList posts;

    public PostAdapter(Context context, ArrayList objects) {
        //super(context, textViewResourceId, objects);
        layoutInflater = LayoutInflater.from(context);
        this.posts = objects;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.item_list_gallery, null);
            holder = new ViewHolder();
            holder.postIV = (ImageView) convertView.findViewById(R.id.iv_post);
            holder.userImageIv = (ImageView) convertView.findViewById(R.id.iv_user_post_gallery);

            holder.shopTV = (TextView) convertView.findViewById(R.id.tv_shop);
            holder.priceTV = (TextView) convertView.findViewById(R.id.tv_price);
            holder.usernameTV = (TextView) convertView.findViewById(R.id.tv_username);
            holder.numberLikesTV = (TextView) convertView.findViewById(R.id.tv_number_like);
            holder.numberCommentsTV = (TextView) convertView.findViewById(R.id.tv_number_comments);

            convertView.setTag(holder); // TODO: scoprire che cazzo vuol dire
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.userImageIv.setTag(position);
        holder.postIV.setTag(position);

        Post p = (Post) posts.get(position);

        holder.shopTV.setText(p.getShopName());
        // TODO: aggiungere la valuta
        holder.priceTV.setText(p.getPrice() + " €");
        holder.usernameTV.setText(p.getUser().getUsername());
        holder.numberLikesTV.setText(p.getLikesCount() + "");
        holder.numberCommentsTV.setText(p.getCommentCount() + "");

        if (holder.postIV != null) {
            new ImageDownloaderTask(holder.postIV).execute(p.getImageUrl());
        }
        if (holder.userImageIv != null) {
            // TODO: per l'immagine dell'utente vedere
            //new ImageDownloaderTask(holder.userImageIv).execute(p.getUser().getImageUrl());
        }

        return convertView;
    }

    static class ViewHolder {
        TextView shopTV;
        TextView priceTV;
        TextView usernameTV;
        TextView numberLikesTV;
        TextView numberCommentsTV;
        ImageView postIV;
        ImageView userImageIv;
    }
}
空指针

我建议您使用AQuery的图像加载

我的代码与AQuery的图片加载效果很好

public class FriendListAdapter extends BaseAdapter {

private static class ViewHolder {
    public final RelativeLayout rootView;
    public final ImageView ivFriendAvatar;
    public final TextView tvFriendName;
    public final ImageView ivOnlineStatus;

    private ViewHolder(RelativeLayout rootView, ImageView ivFriendAvatar,
            TextView tvFriendName, ImageView ivOnlineStatus) {
        this.rootView = rootView;
        this.ivFriendAvatar = ivFriendAvatar;
        this.tvFriendName = tvFriendName;
        this.ivOnlineStatus = ivOnlineStatus;
    }

    public static ViewHolder create(RelativeLayout rootView) {
        ImageView ivFriendAvatar = (ImageView) rootView
                .findViewById(R.id.iv_friend_avatar);
        TextView tvFriendName = (TextView) rootView
                .findViewById(R.id.tv_friend_name);
        ImageView ivOnlineStatus = (ImageView) rootView
                .findViewById(R.id.iv_online_status);
        return new ViewHolder(rootView, ivFriendAvatar, tvFriendName,
                ivOnlineStatus);
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder vh;
    if (convertView == null) {
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.item_lv_friend_list,
                parent, false);
        vh = ViewHolder.create((RelativeLayout) convertView);
        convertView.setTag(vh);
    } else {
        vh = (ViewHolder) convertView.getTag();
    }

    AQuery aq = listAq.recycle(convertView);
    Bitmap placeHolder = aq.getCachedImage(R.drawable.anochat_ic_stub);

    Profile item = data.get(position);

    try {
        isLoadDelay = aq.shouldDelay(position, convertView, parent,
                item.getRealAvatar().getThumbnailURL());
    } catch (Exception e) {
        isLoadDelay = false;
    }

    if (isLoadDelay) {
        aq.id(vh.ivFriendAvatar).image(placeHolder);
    } else {
        if (item.getRealAvatar() == null) {
            aq.id(vh.ivFriendAvatar).image(R.drawable.anochat_ic_avatar);
        } else {
            aq.id(vh.ivFriendAvatar).image(item.getRealAvatar().getThumbnailURL(), true, true, 0,
                    R.drawable.anochat_ic_stub);
        }
    }

    if (item.getOnlineStatus() == OnlineStatus.ONLINE.ordinal()) {
        vh.ivOnlineStatus.setImageResource(R.drawable.anochat_ic_online);
    } else {
        vh.ivOnlineStatus.setImageResource(R.drawable.anochat_ic_offline);
    }

    if (item.getRealName() == null || item.getRealName().trim().length() == 0) {
        vh.tvFriendName.setText(item.getUserName());
    } else {
        vh.tvFriendName.setText(item.getRealName());
    }

    return convertView;
}

private LayoutInflater mInflater;
private Context context;
private List<Profile> data = new ArrayList<Profile>();
private AQuery listAq;
private boolean isLoadDelay;

// Constructors
public FriendListAdapter(Context context, List<Profile> data, AQuery listAq) {
    super();
    this.mInflater = LayoutInflater.from(context);
    this.context = context;
    this.data = data;
    this.listAq = listAq;
}

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

自定义ListView的适配器

通过自定义适配器在Listview的ImageView中动态添加图像

ImageView在getView()时崩溃了自定义适配器

自定义ListView适配器中的NullPointerException

从自定义基本适配器过滤 ListView

在自定义适配器中遍历ListView

滚动时的ListView自定义适配器错误

自定义ListView适配器的异常行为

Android自定义ListView /适配器

Android ListView onItemclick以及自定义适配器

自定义适配器ListView错误

自定义ListView适配器Android

使用自定义适配器未显示ListView

使用自定义适配器从listview搜索项目

Android ListView onClickListener自定义适配器

使用自定义适配器的ListView中的自定义行

Android Studio中带有自定义适配器的自定义ListView

ListView /自定义数组适配器-调用getView时适配器设置为null

使用自定义 ListView 适配器刷新 Fragment ListView

在imageview上启动活动,单击自定义数组适配器

如何通过自定义适配器为列表视图动态设置imageView源?

自定义GridView适配器中的TextView不会更新,但是ImageView会更新

花时间在自定义信息窗口适配器中的 imageview 中加载图像

自定义适配器中的空对象引用上的ImageView setOnClickListener

Imageview和ListViews-解决方案是自定义适配器吗?

具有自定义Android适配器的ArrayIndexOutOfBoundsException,用于ListView中的多个视图

从自定义适配器更改数据后刷新listview

将值从MainActivity传递到自定义listview适配器类

自定义适配器,然后单击ListView中的项目