1

我沒有找到答案hereherehereRecyclerView和Picasso圖像在滾動後消失

我有一個活動,顯示職位列表(有或沒有圖像)。當我向下滾動並使用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

這是很難說爲什麼會這樣跟你貼的代碼。你能分享一點點嗎?你有沒有針對畢加索的特定配置政策? – Blackbelt

+0

@Blackbelt請參閱更新。我沒有任何具體的配置。這是非常基本的:從服務器獲取帖子,每個帖子都有圖片url,使用picasso通過url將圖片加載到ImageView。 – Andrei

+0

它看起來不錯 - 如果你登錄'item.getPhoto()'? – Blackbelt

回答

1

因此,顯然RecyclerView是從我的列表中回收的項目,並出於某種原因後無法重新加載圖像。好問題「爲什麼?」......也許是因爲我做錯了什麼,不確定。這幫了我:

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

基本上,你正在關閉物品回收。它適用於我,因爲我不渲染巨大的物品清單。

2

我也遇到了這個問題,但不想禁用回收。我發現,通過顯式設置ImageView的知名度View.VISIBLE之前進行調用畢加索,甚至滾動後加載的圖片:

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

+0

這是正確的答案,請接受它,讓別人知道它的工作原理 –

+0

@Billy Brawner,男人非常感謝你..你救了我的一天!這應該是正確的答案 –

相關問題