2015-10-04 137 views
2

我使用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代码见上文

问题

显示子视图不是动画,回去是动画...

回答

3

对不起,但这是一个记录过渡框架的限制。

https://developer.android.com/intl/es/training/transitions/overview.html#Limitations

限制

本节列出的过渡框架的一些已知的局限性: - 扩展适配器视图,如ListView控件,在与该过渡不兼容的方式管理其子视图类框架。如果您尝试基于AdapterView为视图设置动画,设备显示可能会挂起。

我知道它说ListView但RecyclerView是相同的。在布局视图后,动画框架必须捕获transitionName值,并且ListViewRecyclerView需要额外时间才能获取适配器,创建子视图,在屏幕上布置这些子视图,然后将它们绑定到数据。过渡框架不能“看到”那些观点。

我最好给你的建议是从你的适配器的虚拟物品上展开实际活动,只是为了过渡到运行,然后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); 
     } 
     }; 

它对我来说工作正常。

+0

不知道。感谢您的信息。实际上,我会坚持只对后面的过渡设置动画,并且现在就忘记这种情况下的显示动画...我不想在细节视图上两次构建第一个视图,尽管这不是太多工作。 。目前这只是一个小美女的错误,如果它不被支持,我可以生活 – prom85

+0

只是一件事,这应该也适用于viewpager,不是吗? – prom85

+0

我从来没有测试过,但我很确定ViewPager会有相同的问题 – Budius

0

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); 
     } 
    });