我有一个 ListView,它会在我每次上下滚动时不断刷新图像
我正在从我提供给 Picasso 的 JSON 中选择图像 url。
我正在使用 Picasso 加载图像。
所有图像的总大小为 516kb,我知道,我不认为这是缓存问题,因为图像大小实际上很小。
老实说,我在S.O上研究过这个问题,还没有看到任何好的解决方案。
也许这个问题与 Picasso 无关,也许我的实现实际上是错误的。我需要更多这方面的知识。
下面是我的代码。
public class ImageAdapter extends ArrayAdapter<Genres> {
ArrayList<Genres> movieList;
TextView movietitle, moviecategory;
LayoutInflater vi;
int Resource;
ViewHolder holder;
private Context mContext;
public ImageAdapter(Context context, int resource, ArrayList<Genres> objects) {
super(context, resource, objects);
vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Resource = resource;
movieList = objects;
mContext = context;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ImageView imageView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.imageview = (ImageView) v.findViewById(R.id.movieimage);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(96, 128);
holder.imageview.setLayoutParams(layoutParams);
holder.imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.imageview.setPadding(4, 4, 4, 4);
holder.imageview.setAdjustViewBounds(true);
holder.movietitle = (TextView) v.findViewById(R.id.movietitle);
holder.moviecategory = (TextView) v.findViewById(R.id.moviecategory);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
Picasso.with(mContext)
.load(movieList.get(position).getImage())
.noFade()
.into(holder.imageview);
holder.movietitle.setText(movieList.get(position).getMoviename());
holder.moviecategory.setText(movieList.get(position).getCategory());
return v;
}
static class ViewHolder {
public ImageView imageview;
public TextView movietitle;
public TextView moviecategory;
}
}
最佳答案
我认为您在这里遇到的问题是您将 holder 对象设为适配器类的实例变量,因此实际上您只有一个 View holder。
尝试删除实例变量声明
LayoutInflater vi;
int Resource;
ViewHolder holder; // remove or comment out this line
private Context mContext;
然后创建新的 View 持有者和 getTag()
局部变量。
所以这两个变化:
首先:
if (v == null) {
// holder = new ViewHolder();
ViewHolder holder = new ViewHolder(); // replace above commented line with this line
v = vi.inflate(Resource, null);
然后在你的 else 子句中:
} else {
// holder = (ViewHolder) v.getTag();
ViewHolder holder = (ViewHolder) v.getTag(); // replace above commented line with this one.
}
现在布局存储的 holder 将是不同的 View ,而不是您当前拥有的唯一一个 View 。
作为引用,我在 Picasso 中使用了一个适配器。有几个不同之处,但我认为最主要的是您对 viewHolder 变量使用单个实例变量。
public class FollowedUsersListAdapter extends ArrayAdapter<UserListItem> {
private final Context context;
private final ArrayList<UserListItem> values;
public FollowedUsersListAdapter(Context context, ArrayList<UserListItem> values) {
super(context, R.layout.row_layout, values);
this.context = context;
this.values = values;
}
static class ViewHolder {
public TextView userNameView;
public TextView lastPostView;
public TextView postedTimeAgoView;
public ImageView imageView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View followedUserView = convertView;
if (followedUserView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
followedUserView = inflater.inflate(R.layout.followed_user_item_layout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.userNameView = (TextView) followedUserView.findViewById(R.id.user_name);
viewHolder.lastPostView = (TextView) followedUserView.findViewById(R.id.last_post);
viewHolder.postedTimeAgoView = (TextView) followedUserView.findViewById(R.id.posted_time_ago);
viewHolder.imageView = (ImageView) followedUserView.findViewById(R.id.user_icon);
followedUserView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) followedUserView.getTag();
holder.userNameView.setText(values.get(position).getName());
holder.lastPostView.setText(values.get(position).getLastMicropost());
holder.postedTimeAgoView.setText(values.get(position).getPostedTimeAgo());
ImageView imageView = holder.imageView;
String gravatarURL = "http://www.gravatar.com/avatar/"
+ values.get(position).getGravatarId();
Picasso.with(context).load(gravatarURL).into(imageView);
return followedUserView;
}
}
关于android - picasso 每次滚动时都会在 ListView 中刷新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738421/