问题描述
在数据源不为空、adapter中getItemCount返回正确条目数的情况下。RecyclerView不刷新数据。通过断点调试发现没有调用onCreateViewHolder和onBindViewHolder两个方法。
发现过程
查阅了很多帖子,发生这种问题主要集中在三种情况:
1、数据源为空
2、getItemCount返回0
3、没有设置layoutManager
我的代码没有出现以上问题,仍然不掉用两个方法。
之后查阅到一些帖子,说可能是RecyclerView嵌套在ScrollView中,导致空间测量错误。使得RecyclerView测得的可用空间为0,不创建item,表现为空白。
虽然我没有使用ScrollView,但是应该排查一下“控件测量导致的错误”
使用查看控件树,发现在RecyclerView上方处于同一层的Linerlayout积压了RecyclerView的空间。
原来是定义ToolBar时,将其父控件的height写成了match_parent。非常低级的错误。
Linearlayout 占据了整个画布,使得RecyclerView没有了空间 image.png
解决
改成wrap_content后,Linearlayout高度正常。RecyclerView正确刷新。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
空间重新分布,正常显示
总结
在进行宽高的定义时,一定要慎重。许多依赖空间测量的过程可能会因为一个随意定义的参数而出现错误。并且此类错误比较难排查。
网友评论