2

我得到了圖像適配器,其中每個項目都是用戶圖像,點擊後它會打開一個具有選定用戶圖像的新活動,因此我將該圖像標記爲共享元素並使用活動轉換。數據變化時的活動轉換

我對第二個活動執行的操作的一部分會影響所有用戶,因此適配器將調用notifyDataSetChanged並將位置重置爲列表頂部。

當發生這種情況時,它會弄亂返回動畫,當我關閉第二個活動並返回到列表中的數據已更改,以便圖像動畫到錯誤的單元格。

我有兩個問題:

  1. 我能做些什麼,以重新映射動畫右邊的單元格?所有單元格都獲得了相同的共享ID ...
  2. 如果我的用戶不再在列表中可見,如何用不同的動畫替換返回動畫?

回答

1

如何才能將動畫重新映射到正確的單元格?所有單元格都有相同的共享ID。

在第一個活動中,您應該有一些指定啓動第二個活動的項的鍵。假設您有一個Map唯一的userId s和User s,即Map<Integer, User>

  1. 當您啓動第二個活動傳入地圖這User的關鍵,讓我們說這是42。 (在地圖42 -> John Doe中,您正在啓動John Doe的第二項活動)。
  2. setExitSharedElementCallback()在第一個活動並覆蓋onMapSharedElements()

    override fun onMapSharedElements(names: MutableList<String>?, 
              sharedElements: MutableMap<String, View>?) { 
        // we will implement this in step 6        
    } 
    
  3. 在第一個活動覆蓋onActivityReenter(),延緩轉型supportPostponeEnterTransition(),爲了不顯示過渡,直到我們取得了一些動作(例如我們要滾動,以顯示項目的列表)。

  4. onActivityReenter()保存Bundle,您已從第二個活動通過Intent(我們將在步驟7中看到)通過。
  5. onActivityReenter()中推遲轉換後,根據您添加到此捆綁包中的信息對UI執行一些更改。特別是,在我們的情況下,這個捆綁包將包含發起第二項活動的User的原始Integer密鑰。您可以通過此鍵在列表中找到User的當前位置,並將RecyclerView滾動到該新位置。使該項目可見後,您可以按下觸發器並讓系統通過supportStartPostponedEnterTransition()開始轉換。
  6. SharedElementCallback::onMapSharedElements()檢查天氣Bundle您在步驟4中保存的是否爲空。如果它不爲空,那就意味着你在第二個活動中做了某些事情,並且你想重新映射共享元素。這意味着你必須做這樣的事情:

    override fun onMapSharedElements(names: MutableList<String>?, 
               sharedElements: MutableMap<String, View>?) { 
        // `reenterBundle` is the `Bundle` you have saved in step 3 
        if (null != reenterBundle 
          && reenterBundle!!.containsKey("KEY_FROM_ACTIVITY_2") 
          && null != view) { 
         val key = reenterBundle!!.getInt("KEY_FROM_ACTIVITY_2"); 
         val newSharedElement = ... // find corresponding view with the `key` 
         val newTransitionName = ... // transition name of the view 
    
         // clear previous mapping and add new one 
         names?.clear() 
         names?.add(newTransitionName) 
         sharedElements?.clear() 
         sharedElements?.put(newTransitionName, newSharedElement) 
         reenterBundle = null 
        } else { 
         // The activity is exiting 
        }        
    } 
    
  7. 在第二個活動覆蓋finishAfterTransition()

    override fun finishAfterTransition() { 
        val data = Intent() 
        data.putExtra("KEY_FROM_ACTIVITY_2", 42) // `42` is the original position that we passed to this activity via Intent when launching it 
        setResult(RESULT_OK, data) 
        super.finishAfterTransition() 
    } 
    

如果我的用戶不再是可見的名單,怎麼就我可以用不同的動畫替換返回動畫嗎?

您可以使其可見(例如,通過滾動RecyclerView這麼多,你的看法變得可見),或者你可以通過清除namessharedElements,並且不添加任何東西放進去刪除第6步中共享的元素轉變。

我希望你學過的概念,它是如何工作雖然看上去有點凌亂。至於你們幫助我可以從我寫一個應用程序共享一些代碼:

MainActivity - MainPresenter

DetailActivity