两个RecyclerView之间的活动转换
我使用GridLayout
将一个RecyclerView
设置为另一个。它显示图像像一个画廊。两个RecyclerView之间的活动转换
父RecyclerView
显示了一个文件夹的第3个元素,孩子RecyclerView
显示网格中的全部内容......
主适配器
@Override
public void onBindViewHolder(FolderViewHolder holder, int position) {
holder.transitionPairs.clear();
for (int i = 0; i < 3; i++) {
ImageView iv = holder.getIconView(i);
Image image = mItems.get(position).getImages().get(i);
holder.transitionPairs.add(new Pair(iv, image.getTransitionName()));
}
孩子适配器
@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
ViewCompat.setTransitionName(holder.icon, mItems.get(position).getTransitionName());
}
-
个
- 两个适配器设置相同的转换名称,它是从图像中的URI产生,所以它的出奇制胜
我启动子视图类似以下内容:
Intent intent = new Intent(getActivity(), ImagesActivity.class);
intent.putExtra("folderIndex", pos);
intent.putExtra("folder", item);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), vh.getTransitionPairs().toArray(new Pair[vh.getTransitionPairs().size()]));
getActivity().startActivity(intent, options.toBundle());
}
else
getActivity().startActivity(intent);
的转变对保存在ViewHolder
并且每当ViewHolder
势必产生,因为你可以在ViewHolders
代码见上文
问题
显示子视图不是动画,回去是动画...
对不起,但这是一个记录过渡框架的限制。
https://developer.android.com/intl/es/training/transitions/overview.html#Limitations
限制
本节列出的过渡框架的一些已知的局限性: - 扩展适配器视图,如ListView控件,在与该过渡不兼容的方式管理其子视图类框架。如果您尝试基于AdapterView为视图设置动画,设备显示可能会挂起。
我知道它说ListView
但RecyclerView是相同的。在布局视图后,动画框架必须捕获transitionName
值,并且ListView
和RecyclerView
需要额外时间才能获取适配器,创建子视图,在屏幕上布置这些子视图,然后将它们绑定到数据。过渡框架不能“看到”那些观点。
我最好给你的建议是从你的适配器的虚拟物品上展开实际活动,只是为了过渡到运行,然后onStart你设置这个视图去GONE
。
编辑:
基于由OP(Having issues using Android 5.0 Activity transitions onto an activity with a ViewPager)我已经结束开发自己提供的链接,但非常类似的解决方案上。
在我自己的项目中,我有一个GridLayoutManager,每个屏幕大约有7个元素,并且对一个LinearLayoutManager进行动画处理,每个视图大多为1(但有时您可以在前后看到角落)。
在链接的响应中,解决方案是使用Activity.postponeEnterTransition()
和Activity.startPostponedEnterTransition()
和OnPreDrawListener
正确提供所有转换。
要记住的重要事实是视图必须附加到转换框架的窗口才能捕获它。所以我使用OnAttachStateChangeListener
来调度转换,而不是OnPreDraw
。这应该使其过渡到平稳过渡。
// somewhere on the `onBind` code I put that
itemView.addOnAttachStateChangeListener(listener);
// and this is the listener
private final View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
@Override public void onViewAttachedToWindow(View v) {
activity.startPostponedEnterTransition();
v.removeOnAttachStateChangeListener(this);
}
@Override public void onViewDetachedFromWindow(View v) {
v.removeOnAttachStateChangeListener(this);
}
};
它对我来说工作正常。
1 - 确保您的RecyclerView有正确的看法(S)充气
2 - 添加使用setEnterSharedElementCallback和覆盖 “onMapSharedElements” 一SharedElementCallback。
3 - 将缺少的视图添加到sharedElements映射(直接从您的适配器或RecyclerView中获取它们)。
setEnterSharedElementCallback(new SharedElementCallback() {
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
sharedElements.put("bla", recyclerView.findViewWithTag("bla"));
super.onMapSharedElements(names, sharedElements);
}
});
不知道。感谢您的信息。实际上,我会坚持只对后面的过渡设置动画,并且现在就忘记这种情况下的显示动画...我不想在细节视图上两次构建第一个视图,尽管这不是太多工作。 。目前这只是一个小美女的错误,如果它不被支持,我可以生活 – prom85
只是一件事,这应该也适用于viewpager,不是吗? – prom85
我从来没有测试过,但我很确定ViewPager会有相同的问题 – Budius