我在print "you lose (NAME) GAME OVER"
中显示一组项目。数据从服务器下载,每次下载一组项目。但是,有时只有一组数据无法填满屏幕,因此我希望RecyclerView
能够检测到此问题,并开始加载下一组数据,直到屏幕填满为止。
例如,如果第1页的数据不够,则加载第2页的数据。如果仍然没有,则加载第3页的数据,依此类推。
检测部分并不困难,因为我可以得到以下参数:
RecyclerView
但问题出在 int visibleItemCount = mLayoutManager.getChildCount();
int totalItemCount = mLayoutManager.getItemCount();
int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
。例如,下面是我设置数据的代码:
notifyDataSetChanged()
调用public void setData(List data){
updataData(data);
mAdapter.notifyDataSetChanged();
if(ifScreenNotFilled()){
loadNextGroupData(); // it calls 'setData()' recursively
}
}
时,递归调用loadNextGroupData()
。事实证明,数据列表的大小不断扩大,而setData
始终为零,屏幕上没有任何内容。
如果删除代码的递归部分,则第一组数据将加载到屏幕中。我对visibleItemCount
的机制非常好奇。
有没有一个解决方案让notifyDataSetChanged()
在没有填满屏幕时自动更新?
答案 0 :(得分:0)
尝试在mRecyclerView上使用getHeight()并获取它的高度并将其与显示高度进行比较。
int height = getWindow().getWindowManager().getDefaultDisplay().getHeight()
答案 1 :(得分:0)
我找到了notifyDataSetChanged()
不起作用的原因。这是因为递归调用setData()
方法使它永远不会返回。因此,UI线程无法执行notifyDataSetChanged()
。
解决方案是使用Handler
将递归部分发布到UI线程的消息队列中。
mHandler = new Handler(Looper.getMainLooper());
public void setData(List data){
updataData(data);
mAdapter.notifyDataSetChanged();
if(ifScreenNotFilled()){
mHandler.post(new Runnable(){
@override
public void run(){
loadNextGroupData();
}
}
}
}
对于那些稍后可能会看到这个问题的人,可以在我的回购中找到上面代码的具体实现:https://github.com/SphiaTower/AutoPagerRecyclerManager。
中的setData()
方法