Android Activity首次加载不显示条目,新增数据后不自动刷新如何解决?
问题原因
- 生命周期加载逻辑错位:90%以上的该类问题都是因为你只在首个Activity的
onCreate()方法中写了数据库读取、列表绑定的逻辑,没有在onResume()生命周期回调中添加数据刷新逻辑。首个Activity第一次启动时onCreate()执行,此时数据库为空,列表加载为空;从新增页返回时,首个Activity没有被销毁,不会重新执行onCreate(),自然不会重新读取数据库的新增数据。跳转其他页面再返回时会触发onResume()执行,所以此时能加载到新数据。 - 列表适配器未主动通知刷新:如果你用的是RecyclerView/ListView,在从数据库查询到新数据、更新了适配器绑定的数据集之后,没有主动调用
notifyDataSetChanged()或者对应的增量通知方法(比如notifyItemInserted()),系统不会主动重绘列表。出现2条及以上数据后正常展示,大概率是你代码中存在隐藏的判断逻辑,比如当数据集长度≥2时会主动触发一次适配器刷新,或者列表重绘阈值刚好在2条时触发。 - 数据库事务未及时提交:如果你的数据库写入操作没有手动提交事务,或者开启了事务但写入完成后没有立刻执行commit,首次写入后立刻回到前页查询,可能会因为事务还没落地查不到新数据,等待页面切换的时间差后事务提交完成,就能正常查询到内容。
修复方案
- 把数据库读取、列表刷新的逻辑封装成独立方法,比如
loadDataFromDB(),除了onCreate()中调用一次,在onResume()方法中也调用该方法,保证每次页面回到前台都会拉取最新的数据库内容。 - 不需要额外重载itemView相关方法,更新适配器绑定的数据集之后,立刻调用适配器的
notifyDataSetChanged()方法,就可以强制刷新所有列表条目。如果要优化性能,也可以在新增条目后调用notifyItemInserted(新条目位置)做增量刷新。 - 检查数据库写入逻辑,写入完成后立刻执行事务提交,保证后续查询能立刻拿到最新数据。
内容的提问来源于stack exchange,提问作者ForthRider
相关产品推荐
相关产品推荐

