2

各アイテムがユーザイメージであるイメージアダプタをクリックすると、選択されたユーザイメージで新しいアクティビティが開き、イメージを共有エレメントとしてマークし、アクティビティトランジションを使用します。データが変更されたときのアクティビティの遷移

2番目のアクティビティで実行するアクションの一部はすべてのユーザーに影響するため、アダプタはnotifyDataSetChangedを呼び出してリストの先頭に位置をリセットします。

これが起こると、2番目のアクティビティを閉じてリストに戻ったときに戻りアニメーションが乱れるので、その中のデータが変更され、間違ったセルにアニメーションが適用されます。

私は2つの質問だ:私は右のセルにアニメーションを再マッピングするために何ができる

  1. を?すべてのセルが同じ共有IDを持っています...
  2. 私のユーザーがリストに表示されなくなった場合、戻りアニメーションを別のアニメーションに置き換えるにはどうすればよいですか?

答えて

1

アニメーションを正しいセルに再マップするにはどうすればよいですか?すべてのセルに同じ共有IDが割り当てられています。

最初のアクティビティでは、2番目のアクティビティを起動するアイテムを指定するキーが必要です。ユニークuserId秒とUser秒のMapがあるとします。つまり、Map<Integer, User>とします。

  1. 2番目の活動はマップ内のこのUserのキーを渡す起動すると、のは、それが42あるとしましょう。 (地図42 -> John Doeで、John Doeの2番目の活動を開始しています)。
  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()で、2番目のアクティビティからIntent(手順7を参照)を経由して渡されたBundleを保存します。
  5. onActivityReenter()で延期を延期した後、このバンドルに追加した情報に基づいてUIを変更します。特にこの場合、このバンドルには、Userの元のIntegerキーが含まれ、2番目のアクティビティが開始されます。このキーで一覧にUserの現在の場所があり、RecyclerViewをその新しい位置にスクロールします。この項目を表示させた後、トリガーを押して、システムが遷移を開始するようにすることができます。supportStartPostponedEnterTransition()
  6. SharedElementCallback::onMapSharedElements()で、ステップ4で保存したBundleの天気を確認してください。 nullでない場合は、2番目のアクティビティで何かを作成したことになり、共有要素の再マッピングが発生することを意味します。第2の活性オーバーライドfinishAfterTransition()

    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. :これは、あなたがこのような何かをしなければならないことを意味私のユーザーはもはや見えリスト、どのようにある場合には

    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

関連する問題