今儿个咱来聊聊我在捣鼓安卓开发时遇到的一个坑,跟notifyDataSetInvalidated()
这个方法有关。说起来都是泪,不过也算吃一堑长一智,现在我把它记录下来,也给大伙儿提个醒。
我做的是一个列表展示的功能,用的是ListView
。你知道的,ListView
需要一个Adapter
来提供数据。我写个自定义的Adapter
,数据,是从服务器获取的。一切看起来都很美列表也能正常显示。
后来需求变,数据源可能要换。打个比方,原来数据是从“仓库A”拿的,现在要改成从“仓库B”拿。这可咋整?我寻思着,直接把Adapter
里的数据源换掉不就得?
于是我动手改代码。把数据源的地址给换,心想这下应该没问题。结果,我发现列表还是显示原来的数据!这可把我给整懵。我各种检查,确认数据源确实是换,可为啥列表就是不更新?
我开始在网上疯狂搜索,各种查资料,各种试。终于在一个犄角旮旯里找到notifyDataSetInvalidated()
这个方法。这哥们儿是干啥的?简单来说,就是告诉ListView
:“老兄,你的数据源已经‘失效’,赶紧重新加载一遍!”
我赶紧在切换数据源之后,加上这么一句:

这一加,列表立马就更新!显示的是新数据源的内容。当时我那个激动,就像发现新大陆一样!
这里我得强调一下:
notifyDataSetChanged()
这个方法,它也能更新列表,但它只是告诉ListView
数据有变化,ListView
会尽量保持原来的状态,比如滚动的位置啥的。- 而
notifyDataSetInvalidated()
就不一样,它是告诉ListView
,原来的数据已经完全不能用,你得从头开始,把整个列表重新布局一遍。
啥时候用哪个,你得看具体情况。像我这回数据源都换,那肯定得用notifyDataSetInvalidated()
,让ListView
彻底刷新一遍。
总结
这回的经历让我明白一个道理:遇到问题,不能光埋头苦干,得多查资料,多看看别人是怎么做的。实践出真知,有些东西,你不亲自踩个坑,还真就体会不到。
希望我的这回分享能帮到你。记住,当你切换整个数据源的时候,一定要用notifyDataSetInvalidated()
来通知你的列表进行刷新!