私の状況は次のとおりです。データを挿入する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
が更新されていることを確認する方法はありますか?行の後
' _adapter.addを追加します。 'response.getData()'がリストを返すとは言及していませんでした。 'add()'がどのように定義されるかは以下の通りです: public void add(リスト dataSet){ int oldSize = _dataSet.size(); _dataSet.addAll(dataSet); notifyItemRangeInserted(oldSize、dataSet.size()); } しかし、私は 'notifyItemRangeInserted'を' notifyDataSetChanged'に変更すると動作します!どうやって? 'notifyItemChanged'を使用していることに気付きました。なぜnotifyItemInserted'? –
内部的には、どちらも 'notifyItemRangeInserted(position、1)'という関数を呼び出しています。 –