2017-08-21 71 views
0

從服務器(API REST)中,我可以獲得包含每個項目(產品)的列表。我使用適配器將該列表映射到RecyclerView中。我顯示一個加載視圖,直到我收到該列表。從RecyclerView的每個項目的網絡中加載數據

但是,我必須在每行中顯示更多信息,但我只能通過另一個HTTP請求(每個項目)獲取該信息,併發送該產品的ID。因此,我想用該信息異步填充每行的UI(當行顯示時)。

實現該目標的更好方法如何?我認爲這與異步圖像加載有同樣的問題,所以我應該做一些像Picasso或Universal Image Loading這樣的庫。不是嗎?

你知道任何圖書館爲了幫助我嗎?

在此先感謝!

+0

如果行顯示,您可以爲每個RecyclerView條目使用AsyncTaskLoader。 –

+0

是的!無論如何,我應該使用de ViewHolder來管理視圖的重用:也許,當服務響應時,視圖被重用並與另一個項目關聯。 – LopezAgrela

+0

如果你有一個靜態視圖,它將很容易重用。如果您有「點擊可見」視圖,則無論如何都必須呈現該視圖。 如果你經常這樣做,也許你應該考慮一個在開始時由null填充的持有數據結構(所以點擊會發出一個Asynctask),並且如果你已經下載了相應的項目,它會被填充(點擊會發出一個加載來自對象)。 或者如果它不是很大(沒有圖像或視頻)在開始時完整地下載附加信息,這聽起來像是開銷,但有時它使事情變得更容易和更高效。 –

回答

1

您可以通過使用RxJava庫來實現此目的。例如,在你的onBindViewHolder方法,你可能會做這樣的事:

Observable.fromCallable { 
    loadDataAsync(position, <other arguments you need>) 
}.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe { loadedData -> 
    holder.setAdditionalData(loadedData) 
} 

當然,你必須保持每個訂閱跟蹤和取消該項目已以防止內存泄漏被回收後。

無論如何,您應該修改您的API設計,並讓服務器在一個請求/響應週期內發送所有數據,而不是爲每個項目發送大量小HTTP請求。在這種情況下,你的問題就會消失。

+0

謝謝!也許可以。但是我認爲它需要更多的管理,比如控制活動網絡連接的數量(使用ThreadPoolExecutor),或者檢查一個項目的數據是否已經被請求(並緩存)。所以創建一個經理是必須的。也許RxJava不提供任何幫助。 – LopezAgrela

相關問題