在移动端应用开发中,经常需要使用 ListView 来显示一些列表,而更新这些列表中某个 Item 的数据时,通常需要更新整个列表的数据才能更新目标 Item 的数据。这样会造成很多无用的 UI 渲染和数据重复加载。为了解决这个问题,Google 推出了 Android Material Design 中的一个优秀特性:notifyItemChanged。该特性可以使得 ListView 在更新某个 Item 时,只重新绘制该 Item 而不是整个列表。本文将对 ListView 局部更新 Item 及其绑定的特性进行详细探讨。
ListView 中的 notifyItemChanged
notifyItemChanged 方法是 RecyclerView.Adapter 类中提供的一个特定的方法,用于更新指定位置的 Item 内容或状态。它具有以下特点:
- 只会重新绘制指定位置的 Item
- 不会对其他 Item 进行任何操作
- 更新会产生动画效果,并且可以自定义动画
绑定 ViewHolder
在 ListView 中更新 Item 时,需要先 Set 该 Item 所需要的数据。因此,更新时需要借助ViewHolder 类,它扮演了一种数据 Model 与 item View 的多种转换,ViewHolder 可将数据的子部分映射到显示的 view,这样就不必再次查询以获取 view 的子部分。
具体实现如下:
----- --------- ------- -------------------------------------------- - ------- -------------- ---------- ------- ------- --------- ----- ------ ----- ------------ ------- ----------------------- - -------- ------- -------- ---------- ----- ------ ----------------- --------- - ---------------- ------ - ---------------------------------- --------- - -------------------------------------- ----- - ------ ---- -- ---- ---- ----------------- ------- - ----------------------------- ----------------------------------- ----- - - --------- ------ ---- ----------------------------- ------- --- --------- - -------- ------ - ------------------------ ------------------------ - ----- -
局部更新 Item 视图
假设我们有一个应用程序需要显示电影列表,并支持用户选中某个电影,该电影可能会有评分或者评价等信息,如何才能实现在用户评定某个电影后,只更新当前Item View 的评分或评价信息呢?
在使用 notifyItemChanged 前,需要根据 item id 找到对应位置的 ViewHolder,并且修改对应内容。示例代码如下:
--------------- --------- - --- -------------- ----------------- -------------- ---- -------- -------- ----------- ----------------- -------------- ---- ---- -- ------- ------------ ----- -------- ------ -- --- ----- ---- ------ --- -------------- - --- ------- ---- ------------------- ----- ---------------------- -- ----- -------------- - -- ----------------------- - -- ------ - - -------------------------------------------
在这个例子中,targetPosition 是要更新的 item 的位置。当更新完成后,notifyItemChanged 方法只重新渲染目标 item,而不是所有 item。这样可以减少 UI 渲染时间和网络重复请求。
结论
Material Design 中的 ListView 局部更新 Item 及其数据绑定的特性在实践中非常有用。它可以减少列表的数据刷新,提高列表滑动性能和用户体验。当我们需要更新 Item 时,只要调用 notifyItemChanged 即可。尽可能地避免全局数据刷新,使用局部更新机制,可以提高列表的性能和体验。
参考链接
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671bbd549babaf620fad59b0