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