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)',所以它没关系 –