如何使ListView或RecyclerView继续自动加载更多数据,直到屏幕填满

时间:2015-10-03 14:53:39

标签: android android-layout android-recyclerview android-adapter notifydatasetchanged

我在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()在没有填满屏幕时自动更新?

2 个答案:

答案 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

请检查https://github.com/SphiaTower/AutoPagerRecyclerManager/blob/master/lib/src/main/java/tower/sphia/auto_pager_recycler/lib/AutoPagerRecyclerViewManager.java

中的setData()方法