我有一个显示帖子列表的活动(有或没有图片)。当我向下滚动并向上滚动或使用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);
}
});
}
});
}
我发现它非常基本,我不明白为什么图像会一次又一次地消失。我的列表不长,图像在上传到服务器之前调整大小,它们不应该使用太多内存。最糟糕的是,当它们消失时,它们不会重新加载。它们可能在我向下滚动之后重新加载......
谢谢!
答案 0 :(得分:5)
我也遇到过这个问题,但不想禁用回收。我发现通过在调用Picasso之前将ImageView可见性显式设置为View.VISIBLE
,即使在滚动之后也加载了图像:
holder.image.setVisibility(View.VISIBLE);
Picasso.with(context)
.load(imgUrl)
.into(holder.image);
答案 1 :(得分:0)
所以,显然A B
groupA 10
groupB 20
groupA 30
groupC 5
groupB 11
正在从我的列表中回收项目,并且出于某种原因,之后它无法重新加载图像。好问题&#34;为什么?&#34; ...也许是因为我做错了什么,不确定。这对我有所帮助:
RecyclerView
基本上你要关闭物品回收。它对我有用,因为我不会渲染大量的项目列表。
答案 2 :(得分:0)
如果您在适配器中使用if条件,请尝试下面的代码
if (model.image == null || model.equals(""))
viewHolder.ivIndieImage.setVisibility(View.GONE);
else{
viewHolder.ivIndieImage.setVisibility(View.VISIBLE);
}
尝试setVisibility
可见图片。
答案 3 :(得分:0)
你错过了onBindViewHolder中的一件事。在else部分中,您将可见性更改为View.GONE,但在If部分中,您不会再次显示它。因此,在回收站视图中,视图正在被回收意味着数据正在被更改但是如果您修改任何属性,它将对该视图保持相同,并且将在使用相同的回收视图显示的其他项目中看到。
答案 4 :(得分:0)
我能够通过删除相同的调整大小和中心裁切方法来解决此问题,不知何故它们占用了过多内存,这导致了图像加载过程的混乱