共享元素更新图片源

3
我将使用androidx导航组件。在FragmentA中,我有一个包含卡片的RecyclerView。这些卡片包含图片和一个“喜欢”按钮。当用户喜欢内容时,“喜欢”按钮的资源会更改。 这个卡片内容是一个单独的布局,包含在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中更改喜欢按钮的资源并弹回堆栈时,转换发生了,但按钮资源切换回FragmentA中的起始资源。 如何在弹回堆栈时保留共享元素中的src可绘制对象?
2个回答

2

我忘了提到,FragmentA 是 MVI 架构,而 FragmentB 是 MVVM 架构。这意味着 FragmentA 是基于它的 Presenter 减少视图状态而呈现的。接收数据的 adapter 与 fragment 没有紧密耦合,因此它不知道数据的变化。

我已经向我的 Presenter 添加了一个额外的事件,以便在 DB 中的某个项目进行更新时更新视图状态。当用户恢复 FragmentA 时,它会呈现视图状态。ViewState 现在包含更新的项目,我通过将更新的项目传递给 adapter(类似于传递新数据时)来相应地处理该情况。现在两个 ViewHolders 的数据相同,当从 FragmentB -> FragmentA 返回时,我的喜欢状态得以保留。


0
昨天我遇到了类似的问题,但是是关于工具栏上的“喜欢”按钮。 我在主活动中使用了一个静态数组列表,每个“喜欢”按钮都会将组件的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中,我认为更新打开位置上的项目并通知项目更改应该可以解决问题?我真的很想避免这样的静态参数传递。 - parohy
是的,我想如果你想在我的情况下避免静态参数,你可以利用onPause和onResume函数。 - Sylum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接