共享元素更新图片来源

Shared element update image source

我正在使用 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 导航时,共享转换按预期工作。当我弹出堆栈时,它会按预期返回到列表中的原始位置。

问题 如前所述。当我 like/dislike 内容时,点赞按钮的资产发生变化。当我打开 FragmentB 时,类似 ImageView 中的资产被保留。但是当我改变状态时,我改变了 FragmentB 中的类似按钮的资产并弹出堆栈,转换发生但按钮资产切换回 [=] 中的起始资产23=]片段A。 如何在弹出堆栈时保留共享元素中的 src 可绘制对象?

昨天遇到了类似的问题,但是工具栏上有“赞”按钮。 我在主 activity 中使用了一个静态数组列表,每个点赞按钮将组件的 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;

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

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

这样一来,喜欢的组件 activity 总是会以正确的“喜欢”图标恢复。 希望这能以任何方式帮助...

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