RecyclerView共享元素转换 - 返回不同位置

时间:2016-12-06 19:34:31

标签: android android-fragments

在我的应用中,我有一个看起来像这样的RecyclerView: screenshot

每个项目代表一条消息;未读消息始终显示在列表顶部。如果单击任何项​​目,则整个片段将被相应的DetailsFragment替换。我已经设置了从列表项背景到细节片段背景的共享元素转换,以实现“扩展”效果。选择的消息已被读取时,它可以很好地工作;但是,如果您打开未读消息,它会被标记为已读,因此会更改列表中的位置。如果您随后尝试使用RecyclerView返回到片段,则不会播放共享元素转换:详细信息片段将以默认转换(淡入淡出)消失。 我搜索了文档,但共享元素转换并没有真正记录好。有谁知道这个问题的任何解决方案或解决方法?

编辑:我在RecyclerView的onClick中设置了转换,如下所示:

@Override
        public void onItemClick(View view, int position) {
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                MessageDetailsFragment fragment = MessageDetailsFragment.newInstance(message);
                RelativeLayout background = (RelativeLayout) view.findViewById(R.id.three_line_list_item_background);

                TransitionInflater transitionInflater = TransitionInflater.from(getContext());
                Transition t = new Fade();
                Transition details_enter = transitionInflater.inflateTransition(R.transition.details_enter);
                Transition details_exit = transitionInflater.inflateTransition(R.transition.details_exit);

                fragment.setSharedElementEnterTransition(details_enter);
                fragment.setSharedElementReturnTransition(details_exit);
                setSharedElementEnterTransition(details_enter);
                setSharedElementReturnTransition(details_exit);

                fragment.setExitTransition(t);
                fragment.setEnterTransition(t);
                fragment.setReturnTransition(t);
                fragment.setReenterTransition(t);

                setEnterTransition(t);
                setExitTransition(t);
                setReturnTransition(t);
                setReenterTransition(t);

                fragmentTransaction.addSharedElement(background, background.getTransitionName());
                fragmentTransaction.addToBackStack(null).commit();
                fragmentTransaction.replace(((ViewGroup) getView().getParent()).getId(), fragment);
        }

在RecyclerView适配器的onBindViewHolder()和DetailFragment的onCreateView()

中以编程方式设置转换名称(由唯一的消息ID组成)

1 个答案:

答案 0 :(得分:0)

好的,我发现了这个问题。当最终视图位于屏幕之外且未绘制时,转换不会播放。