1
我的情況如下:我有一個RecyclerView,用於插入數據。即使在處理程序中調用後,LayoutManager也不會更新
我一個一個添加數據,直到RecyclerView已滿。數據來自Web服務。
這是我使用的代碼:(!但有時它)
@Override
public void receive(Response response) {
_adapter.add(response.getData());
new Handler().post(new Runnable() {
@Override
public void run() {
fetchIfNotFull();
}
});
}
private void fetchIfNotFull() {
if (_layoutManager.findLastVisibleItemPosition() == _layoutManager.getItemCount() - 1)
fetchData(); // this will call receive(Response) when it's done
}
的問題是,當我運行應用程序時,RecyclerView沒有充滿,就像我期望的那樣。
我發現_layoutManager.findLastVisibleItemPosition()
並不總是返回正確的值(一個我期望至少),而_layoutManager.getItemCount()
呢,所以沒有更多的數據被取出......
我認爲包裹內通話Handler
會有所幫助,所以它會在下次佈局更新後調用,但它並沒有成功。
這裏是奇怪的事情:如果我撥打handler.postDelayed()
1000毫秒,它工作正常! (我沒有嘗試其他值),因爲佈局在之後更新。但我不喜歡這個解決方案(黑客)。有沒有辦法確保LayoutManager
已更新?
'_adapter.add()'已經做它的內部。我沒有提到'response.getData()'返回一個列表。下面是如何定義add(): public void add(List dataSet){oldSize = _dataSet.size(); _dataSet.addAll(dataSet); notifyItemRangeInserted(oldSize,dataSet.size()); } 但是,如果我將'notifyItemRangeInserted'更改爲'notifyDataSetChanged',它就可以工作!怎麼樣? 我也注意到你使用了'notifyItemChanged'。爲什麼不'notifyItemInserted'? –
內部都調用一個函數'notifyItemRangeInserted(position,1)',所以它沒關係 –