【问题标题】:Shared element update image source共享元素更新图片源
【发布时间】:2020-06-26 14:12:36
【问题描述】:

我正在使用 androidx 导航组件。在 FragmentA 中,我有一个带有卡片的回收站视图。这些卡片包含一个图像和一个点赞按钮。当用户喜欢内容时,点赞按钮资产会发生变化。 此卡片内容是一个单独的布局,包含在 RecyclerViews.ViewHolder 布局中:

<MaterialCardView>
    <include layout="@layout/item_main_content_layout" />
</MaterialCardView>

以及上面包含的 item_layout:

    <merge>
        <LinearLayout
            android:id="@+id/content"
            android:transitionName="content">
            <ImageView
                android:id="@+id/image"/>
            <ImageView
                android:id="@+id/like"/>
        </LinearLayout>
    </merge>

在适配器中绑定视图持有者期间,我使用唯一 ID 动态更新 transitionNameFragmentB 包含相同的布局,并且在创建视图时,我使用正在传递的项目更新过渡名称。 当通过单击一个项目从 FragmentA -> FragmentB 导航时,共享转换按预期工作。当我弹回堆栈时,它会按预期回退到列表中的原始位置。

问题 如前所述。当我喜欢/不喜欢内容时,点赞按钮的资产会发生变化。当我打开 FragmentB 时,会保留类似 ImageView 的资产。但是当我更改状态时,我更改了 FragmentB 中的like 按钮的资产并弹回堆栈,发生了转换,但按钮资产切换回了 FragmentA。 弹回堆栈时如何在共享元素中保留src drawable?

【问题讨论】:

    标签: android android-fragments android-architecture-navigation shared-element-transition


    【解决方案1】:

    我忘了说 FragmentA 是 MVI 而 FragmentB 是 MVVM。这意味着 FragmentA 是根据我在其演示器中减少的视图状态呈现的。接收数据的适配器与片段没有紧密耦合,因此它不知道数据的变化。 当数据库中的项目发生某些更新时,我向演示者添加了一个额外的事件来更新视图状态。当用户恢复 FragmentA 时,它会呈现视图状态。 ViewState 现在包含更新的项目,我通过将更新的项目传递给适配器来相应地处理这种情况(传递新数据时类似)。现在两个 ViewHolders 的数据是相同的,当从 FragmentB -> FragmentA 返回时,我的喜欢状态保持不变。

    【讨论】:

      【解决方案2】:

      昨天遇到了类似的问题,但工具栏上有一个“赞”按钮。 我在主要活动中使用了一个静态数组列表,每个赞按钮将组件的 ID 添加到数组中,不喜欢从所述数组中删除该 ID。 所以我这样处理“喜欢”的压力:

          case R.id.action_favorite:
                      pressed = !pressed;
                      // user pressed the heart icon
                      if(pressed)
                      {
                          item.setIcon(R.drawable.liked);
                          MainActivity.favs.add(ID);
                      }
                      else if(!pressed)
                      {
                          item.setIcon(R.drawable.unliked);
                          MainActivity.favs.remove(Integer.valueOf(ID));
                      }
                      return true;
      

      在渲染每个活动(可以喜欢或不喜欢的组件)开始时,我检查了组件 ID 是否在该静态数组中:

      if(!MainActivity.favs.isEmpty())
              {
                  if (MainActivity.favs.contains(ID))
                  {
                      pressed = true;
                  }
              }
      

      这样,被点赞的组件活动总是会使用正确的“点赞”图标恢复。 希望这对您有所帮助...

      【讨论】:

      • 所以如果我理解正确的话,当您恢复 MainActivity? 时,您正在更新视图?我的ViewModel 正在其 rx 回调中接收更新,但可以理解的是它不会更新视图,因为它们在后台并且不再观察 ViewModel。我大声思考,好像当我恢复时我需要更新 RecyclerView ? OnResume/OnResult 我认为在它打开的位置更新项目并通知项目更改应该可以解决问题吗?我真的很想避免这样的静态参数传递。
      • 是的,我想如果你想在我的例子中避免静态参数,你可以使用 onPause 和 onResume 函数。
      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      相关资源
      最近更新 更多