在我的应用中,我有一个看起来像这样的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组成)答案 0 :(得分:0)
好的,我发现了这个问题。当最终视图位于屏幕之外且未绘制时,转换不会播放。