2016-04-15 21 views
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已更新?

回答

-1

_adapter.add(response.getData()); 

後添加此一個

_adapter.notifyItemChanged(_adapter.getItemCount() - 1); 
+0

'_adapter.add()'已經做它的內部。我沒有提到'response.getData()'返回一個列表。下面是如何定義add(): public void add(List dataSet){oldSize = _dataSet.size(); _dataSet.addAll(dataSet); notifyItemRangeInserted(oldSize,dataSet.size()); } 但是,如果我將'notifyItemRangeInserted'更改爲'notifyDataSetChanged',它就可以工作!怎麼樣? 我也注意到你使用了'notifyItemChanged'。爲什麼不'notifyItemInserted'? –

+0

內部都調用一個函數'notifyItemRangeInserted(position,1)',所以它沒關係 –

相關問題