我看到了一个类似的未回答的问题,但我无法在那里发表评论和提问,即使在第一次加载时,他也一直有这个问题:毕加索没有;t加载阵列适配器的第一个图像
所以问题是:我有一个应用程序,我可以无休止地滚动GridView并下载电影海报。当我回到屏幕的最开始时,它有时不会只更新第一张海报,而是显示其他一些图片。
我将Targets设置为ImageView以保持强引用。我的代码如下:
@Override
public View getView(final int position, View view, ViewGroup parent) {
final MovieObject movieObject = getItem(position);
if (view == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.movie_item, parent, false);
}
final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.movie_item_spinner);
final ImageView poster = (ImageView) view.findViewById(R.id.movie_poster);
// Target to show/hide ProgressBar on ImageView
final Target target = new Target() {
@Override
public void onPrepareLoad(Drawable drawable) {
poster.setBackgroundResource(R.color.white);
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from) {
poster.setBackgroundDrawable(new BitmapDrawable(photo));
spinner.setVisibility(View.GONE);
}
@Override
public void onBitmapFailed(Drawable drawable) {
poster.setBackgroundResource(R.color.white);
}
};
// Save strong reference to be able to show pictures without sliding the screen
poster.setTag(target);
Picasso.with(getContext()).load(movieObject.poster_path).into((Target) poster.getTag());
// If movie doesn't have an image - uses text instead
if (movieObject.poster_path.contains("null"))
{
TextView imageText = (TextView) view.findViewById(R.id.movie_poster_text);
imageText.setText(movieObject.title);
}
poster.setContentDescription(movieObject.title);
return view;
}
我该如何解决这个问题?
添加:我还尝试将Targets保存在MovieObject中,我还尝试为Target声明单独的类,但没有任何帮助。
通过回调解决了问题:
@Override
public View getView(final int position, View view, ViewGroup parent) {
...
spinner.setVisibility(View.VISIBLE);
Picasso.with(getContext()).load(movieObject.poster_path).into(poster, new Callback() {
@Override
public void onSuccess() {
spinner.setVisibility(View.GONE);
}
@Override
public void onError() {
poster.setBackgroundResource(R.color.white);
}
});
...
return view;
}
我仍然不确定海报将如何回收。
在毕加索的文献中,他们有以下注释:
注意:回调参数是一个强引用,可以防止"活动"或"片段"被垃圾收集。如果您使用此方法,强烈建议您调用相邻的Picasso.cancelRequest(android.widget.ImageView)调用,以防止临时泄漏
我应该在哪里实施它?