2015-10-04 136 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); 
     } 
    });