滚动后,RecyclerView和Picasso图像消失

问题描述 投票:1回答:5

我没有找到答案hereherehere

我有一个活动显示帖子列表(有或没有图像)。当我向下滚动并向上滚动或使用SwipeRefreshLayout刷新列表时,某些图像可能会消失。我使用RecyclerView显示帖子列表和Picasso来加载图像。这是我的适配器绑定:

@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    // <...>
    if (item.getPhoto() != null) {
        Picasso.with(context)
                .load(item.getPhoto())
                .into(holder.mPostPhoto);
    } else {
        holder.mPostPhoto.setImageDrawable(null);
        holder.mPostPhoto.setVisibility(View.GONE);
    }
}

我发送HTTP请求以获取帖子,当我有新数据时,我调用PostsAdapter

public void addAll(List<PostResponse> items) {
    this.items.clear();
    this.items.addAll(items);

    notifyDataSetChanged();
}

在MainActivity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // <...>
    mPostAdapter = new PostAdapter();
    mPosts.setLayoutManager(new LinearLayoutManager(MainActivity.this));
    mPosts.setAdapter(mPostAdapter);

    mPostsSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            updatePosts();
        }
    });

    updatePosts();
}

private void updatePosts() {
    new Api(this).getPosts(new GetPostsCallback(this) {
        @Override
        public void onSuccess(final Paging<PostResponse> paging) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mPostAdapter.addAll(paging.getData());
                    mPostsSwipeRefresh.setRefreshing(false);
                }
            });
        }
    });
}

我发现它非常基本,我不明白为什么图像会一次又一次地消失。我的列表不长,图像在上传到服务器之前调整大小,它们不应该使用太多内存。最糟糕的是,当它们消失时,它们不会重新加载。它们可能只在我向下滚动后重新加载...

  • 请解释一下为什么会这样。
  • 我该如何解决这个问题?

谢谢!

android imageview android-recyclerview android-imageview picasso
5个回答
5
投票

我也遇到了这个问题,但不想禁用回收。我发现通过在调用Picasso之前显式设置ImageView对View.VISIBLE的可见性,即使在滚动之后加载的图像:

holder.image.setVisibility(View.VISIBLE);
Picasso.with(context)
    .load(imgUrl)
    .into(holder.image);

0
投票

所以,显然RecyclerView正在从我的列表中回收物品,并且由于某种原因它之后无法重新加载图像。好问题“为什么?”......也许是因为我做错了什么,不确定。这对我有所帮助:

recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 0);

基本上你是关闭物品回收。它对我有用,因为我没有渲染大量的项目。


0
投票

如果您在适配器中使用if条件,请尝试下面的代码

    if (model.image == null || model.equals(""))
        viewHolder.ivIndieImage.setVisibility(View.GONE);
    else{
        viewHolder.ivIndieImage.setVisibility(View.VISIBLE);
      }

尝试setVisibility可见的图像。


0
投票

你错过了onBindViewHolder中的一件事。在else部分中,您将可见性更改为View.GONE,但在If部分中,您不会再次显示它。因此,在回收器视图中,视图正在被回收意味着数据正在被更改但是如果您修改任何属性,它将对于该视图保持相同,并且将在使用相同的回收视图显示的其他项目中看到它。


0
投票

我能够通过删除相同的调整大小和中心裁剪方法来修复此问题,不知何故,他们占用了太多内存,这导致了图像加载过程的混乱

© www.soinside.com 2019 - 2024. All rights reserved.