2016-04-15 15 views
1

私の状況は次のとおりです。データを挿入するRecyclerViewがあります。Handler内で呼び出された後でもLayoutManagerが更新されない

RecyclerViewがいっぱいになるまでデータを1つずつ追加します。データは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.getItemCount()がないのに対し、_layoutManager.findLastVisibleItemPosition()は常に、正しい値(私は、少なくとも期待するもの)を返さないことが判明、私は内部の呼び出しをラップすることを考えましたHandlerが役立つので、次回のレイアウトアップデート後に呼び出されますが、そのトリックは行いませんでした。

これは奇妙なことです:handler.postDelayed()を1000ミリ秒で呼び出すと、正常に動作します。 (私は他の値を試していませんでした)、レイアウトはその時間後にでした。しかし、私はこのソリューション(ハック)が気に入らない。 LayoutManagerが更新されていることを確認する方法はありますか?行の後

答えて

-1

_adapter.add(response.getData()); 

`既に内部それをしない)(この1

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

' _adapter.addを追加します。 'response.getData()'がリストを返すとは言及していませんでした。 'add()'がどのように定義されるかは以下の通りです: public void add(リスト dataSet){ int oldSize = _dataSet.size(); _dataSet.addAll(dataSet); notifyItemRangeInserted(oldSize、dataSet.size()); } しかし、私は 'notifyItemRangeInserted'を' notifyDataSetChanged'に変更すると動作します!どうやって? 'notifyItemChanged'を使用していることに気付きました。なぜnotifyItemInserted'? –

+0

内部的には、どちらも 'notifyItemRangeInserted(position、1)'という関数を呼び出しています。 –

関連する問題