【问题标题】:Is there any difference between `ListView.invalidateViews()` and 'Adapter.notifyDataSetChanged()'?`ListView.invalidateViews()` 和 'Adapter.notifyDataSetChanged()' 之间有什么区别吗?
【发布时间】:2012-05-20 19:58:48
【问题描述】:

ListView.invalidateViews()Adapter.notifyDataSetChanged() 有什么区别吗?

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    是的,有。

    ListView.invalidateViews() 用于告诉 ListView 使其所有子项视图无效(重绘它们)。 请注意,视图数不必与项目数相等。 这是因为 ListView 会回收其项目视图并在您滚动时以智能方式在屏幕上移动它们。

    Adapter.notifyDataSetChanged() 另一方面,是告诉适配器的观察者正在适配的内容已经改变。通知数据集更改将导致列表视图再次调用您的适配器方法来调整滚动条、重新生成项目视图等...

    大多数情况下,您希望使用notifyDataSetChanged 而不是invalidateViews,但这当然取决于您要完成的任务。

    【讨论】:

    • 当您说 请注意,查看次数不必与项目数相同,我有点困惑。视图和项目有什么区别。
    • @black crow:列表视图不会为每个项目创建视图。相反,它通常只有适合屏幕的视图数量加一,并在您滚动时移动它们。简而言之:它不会为不可见的项目创建视图。
    • 屏幕上有 10 个视图的空间,而适配器中有 20 个......所以你有 10 个视图和 20 个项目。
    • @black crow:这是一个很难找到的例子。如果您做对了所有事情,那么invalidateViews 将仅在您需要重绘可见项目但它们上没有任何变化时才有用...
    • @GauravAgarwal:invalidateViews 的一个很好的用途是更改ListView 的字体大小:您不会触摸数据,而是触摸渲染。
    猜你喜欢
    • 2013-09-13
    • 2017-04-05
    • 2014-09-18
    • 2015-06-14
    • 2011-05-23
    • 2011-02-15
    • 2011-11-27
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多