我有一个带有图像的RecyclerView,当我按下一个图像时,应用程序会打开另一个活动,其中包含一个具有相同图像但位于所选图像位置的ViewPager。
我在棒棒糖中完成了转换,以便在调用的活动中使用supportpostponeentertransformation和supportstartpostponedenterransformation在活动之间共享此图像,以等待viewpager加载图像以开始转换。
当我进入调用的活动并按下后退键时,转换正常。
我面临的问题是,如果我移动到被调用活动的viewpager中的另一个图像,当我按back键时,它将动画显示在开始时选择的图像,而不是当前选择的图像。
我可以通过以下操作将动画图像更改为在调用的活动中选择的图像:
@Override
public void onBackPressed() {
View view = ((ImageDetailFragment) adapter.getFragment(viewPager,
viewPager.getCurrentItem())).getTransitionView();
ViewCompat.setTransitionName(view, Constants.TRANSITION_IMAGE);
super.onBackPressed();
}
但它正在返回到调用活动列表中原始图像的相同位置。
如何使图像返回到调用活动列表中的位置?
最佳答案
首先要做的是确保视图在没有任何活动转换的情况下正常工作。也就是说,使用viewpager从活动返回时,recyclerview活动应该显示viewpage显示的视图。调用ViewPager活动时,请使用StartActivityForresult并使用结果将RecyclerView滚动到正确的位置。
一旦成功,活动转换就可以开始工作了。我知道你在recyclerview中给了每个视图一个不同的转换名,对吧?绑定视图时,调用setTransitionName并为其指定一个可重复的名称。通常,这是图像url或光标行id,或者最坏情况下是一些咀嚼索引,如“图像”+索引。
接下来需要做的是为调用活动(exit)和被调用活动(enter)设置sharedelementcallback。在每种方法中,都需要重写onmapsharedelements回调来重新映射共享元素。
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
// assuming just one shared element, excuse the ugly code
sharedElements.put(names.get(0), mSharedElement);
}
在这里,msharedelement已经在调用(recyclerview)活动中的onactivityreenter和oncreate中以及finishaftertransition之前(onbackpressed?)在调用(viewpager)活动中。
onactivityreenter为这种情况提供了新的功能。您可以在调用的活动完成之前查看那里的结果。