Tom*_*ino 17 android listview android-listview picasso
我正在使用picasso将服务器中的图像加载到列表视图项,如下所示:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View participantView;
if(convertView == null) {
participantView = inflater.inflate(R.layout.participant_item, parent, false);
} else {
participantView = convertView;
}
TextView textView = (TextView) participantView.findViewById(R.id.participantName);
textView.setText(getItem(position).getName());
ImageView imageView = (ImageView) participantView.findViewById(R.id.participantImage);
String profilePic = getItem(position).getProfilePic();
if(!profilePic.equals("None")) {
Log.d("tom.debug", "creating picture for user: " + getItem(position).getName());
Picasso.with(this.context)
.load(urlToProfilePics + profilePic)
.placeholder(R.drawable.sample_0)
.resize(52, 52)
.into(imageView);
} else {
//load the place holder into the image view
Picasso.with(this.context).load(R.drawable.sample_0);
}
if(!getItem(position).isHere()) {
imageView.setColorFilter(Color.DKGRAY, PorterDuff.Mode.MULTIPLY);
}
return participantView;
}
Run Code Online (Sandbox Code Playgroud)
if语句下的调试日志仅针对真正具有配置文件图片的用户触发.(没有的用户将获得值None).
但是,一些其他列表视图项(没有配置文件pic)也会加载图片.
另一个有用的事实(我认为):当在列表中上下滚动时,获取错误的项目会发生变化.
我不确定我在这里缺少什么.
Alé*_*lho 34
确保在每次要从适配器上的getView()上使用Picasso时调用cancelRequest.
// 1st: reset the imageView
Picasso.with(this.context).cancelRequest(holder.imageView);
// 2nd start a new load for the imageView
Picasso.with(this.context).load(...).into(holder.imageView);
Run Code Online (Sandbox Code Playgroud)
原因是您从convertView参数重用的视图属于Picasso可能已经为另一张图片加载的上一行.
这只是在使用convertView时才真正需要,如果你刚刚为新布局充气,则不需要它.但是你总是可以调用以使代码更容易.
Ye *_*ung -2
我想我也遇到过同样的情况。我建议您的适配器使用ViewHolder模式。
会是这样的。
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View participantView = convertView;
if (participantView == null || participantView.getTag() == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// don't forget to inflate the same layout
participantView = inflater.inflate(R.layout.participant_item, null);
holder = getHolder(participantView);
assert participantView != null;
participantView.setTag(holder);
} else {
holder = (ViewHolder) participantView.getTag();
}
holder.textView.setText(getItem(position).getName());
String profilePic = getItem(position).getProfilePic();
if(!profilePic.equals("None")) {
Log.d("tom.debug", "creating picture for user: " + getItem(position).getName());
Picasso.with(this.context)
.load(urlToProfilePics + profilePic)
.placeholder(R.drawable.sample_0)
.resize(52, 52)
.into(holder.imageView);
} else {
//load the place holder into the image view
Picasso.with(this.context).load(R.drawable.sample_0);
}
if(!getItem(position).isHere()) {
holder.imageView.setColorFilter(Color.DKGRAY, PorterDuff.Mode.MULTIPLY);
}
resetViews(participantView);
return participantView;
}
void resetViews(View v) {
ViewHolder mHolder = new ViewHolder(v);
mHolder.textView.invalidate();
mHolder.imageView.invalidate();
}
static class ViewHolder {
TextView textView;
ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8353 次 |
| 最近记录: |