Android GridView有时不';即使我保存了目标,也不能用毕加索只更新第一项

Android GridView有时不';即使我保存了目标,也不能用毕加索只更新第一项,android,android-arrayadapter,target,picasso,weak-references,Android,Android Arrayadapter,Target,Picasso,Weak References,我看到了一个类似的未回答的问题,但我不能在那里评论和提问,即使是在第一次加载时,他也一直有这个问题: 所以问题是:我有一个应用程序,可以无限滚动GridView并下载电影海报。当我回到屏幕的最开始,它有时不仅会更新第一张海报,还会显示其他一些图片 我将目标设置为ImageView以保持强引用。我的代码如下: @Override public View getView(final int position, View view, ViewGroup parent) { final Mov

我看到了一个类似的未回答的问题,但我不能在那里评论和提问,即使是在第一次加载时,他也一直有这个问题:

所以问题是:我有一个应用程序,可以无限滚动GridView并下载电影海报。当我回到屏幕的最开始,它有时不仅会更新第一张海报,还会显示其他一些图片

我将目标设置为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;
}
我怎样才能解决这个问题


补充:我还尝试在MovieObject中保存目标,我还尝试为目标声明单独的类-没有任何帮助

通过回调解决了问题:

@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)调用以防止临时泄漏


我应该在哪里实施它

你试过取景器图案吗?另外,如果您使用viewholder模式不使用目标,或者您可以尝试使用RecyclerViews。我在这里看到的第一件事是,您将度过一段不愉快的时光,因为您没有在
目标上实现
equals
hashCode
@Bhargav,谢谢你的评论,通过回拨解决了问题。至于viewholder(据我所知,如果我错了,请纠正我)-它对我的progressbar没有帮助(它应该在加载图像时消失)。@EricCochran,是的,我读过这些方法,但我仍然不相信它们会有帮助。你能给我一个关于它们用法的链接或者更好的解释吗?提前谢谢你@DmytroKarataiev这是告诉毕加索“取消”之前对一个等价的
目标的调用。由于重复使用这些视图,您可能会在错误的时间在那里看到错误的图像。