Material Design 中 ListView 局部更新 Item 及其绑定解析

在移动端应用开发中,经常需要使用 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