igeek-YZ / HFRecycleView

带头部(headView)和底部(footView)和下拉刷新,点击事件的RecycleView
67 stars 18 forks source link

数据少的时候 底部加载的loadingview 依然显示 #1

Open azhen111 opened 7 years ago

azhen111 commented 7 years ago

当数据少的时候 底部的loadingview 依然显示 该如何处理一下,谢谢

yazhidev commented 7 years ago

@fanxiaole 碰巧我也在看这个项目,这里做个抛砖引玉。 你说的这个问题出现的原因是出现footView的时机不对。项目里footView出现的时机是当获得的viewType==FOOT_VIEW时,而viewType返回FOOT_VIEW的时机是在BaseAdapter里的getItemViewType()方法里,当footView不为空,且当前的position==mData.size(),即从position的角度判断view处于末尾。这样判断有个缺点就是当view里展示的数据本无法铺满屏幕时,最后一个加载的position本来就是等于数据data.size()的。 分析完原因,我来提供一种解决方法的思路(不保证最优)。解决的角度是判断,是否展示的数据已铺满屏幕?每次加载一行itemView就会加载一次createViewHolder,也是在adapter的该方法里inflate我们的itemView的,createViewHolder正好是带有参数ViewGroup parent的,所以可以先获得父布局的高度,然后累加每次生成的item的高度,当数据展示结束时判断总共加载的item的高度和是否已超出屏幕。如果还未超出屏幕则在getItemViewType()里不返回FOOT_VIEW。 但其实最根本的解决办法是进入页面时默认禁止上拉刷新,当你从服务器获得数据后再判断如果还有下一页数据才打开上拉刷新功能。

igeek-YZ commented 7 years ago

@fanxiaole @yazhi1992 其实我在库里有处理的,具体的处理方式是当你在初始化RecycleViewAdapter的时候如果设置了footView,这个时候Adapter里面的数据Datas是为空的话,footView是不显示的。当然还有一种情况就是你出现的这种情况:当服务器返回的数据集不满一屏幕的时候,footView确实还在显示。我没做处理的理由如下:当请求服务器返回的数据集<每页显示的个数的时候。这个时候一般表示没有数据可加载了(一般加载的条数是超过手机一屏幕的显示个数,如果真的出现你说的这种极端情况,建议通过layoutmanager获取到当前列表显示的最后一项视图的位置跟数据集的个数作比较就可以知道了),那么这个时候我是特意留了一个空间给大家去更新底部的footView视图,详细可见工程GIF视图中但类型列表视图加载的列子。