2

각 항목이 사용자 이미지 인 이미지 어댑터가 있는데 클릭하면 선택된 사용자 이미지로 새로운 활동이 열리므로 이미지를 공유 요소로 표시하고 활동 전환을 사용합니다.데이터가 변경 될 때의 작업 전환

두 번째 활동에서 수행하는 작업 중 일부는 모든 사용자에게 영향을 미치므로 어댑터는 notifyDataSetChanged을 호출하고 위치를 목록의 맨 위로 다시 설정합니다.

두 번째 액티비티를 닫고 목록으로 돌아갈 때 이미지가 잘못된 셀로 애니메이션되도록 이미지가 변경되었습니다.

나는 두 가지 질문을 가지고 :

  1. I 오른쪽 셀 애니메이션을 다시 매핑하기 위해 무엇을 할 수 있는가? 모든 셀에 동일한 공유 ID가 있습니다.
  2. 내 사용자가 더 이상 목록에 표시되지 않는 경우 어떻게 반환 애니메이션을 다른 애니메이션으로 바꿀 수 있습니까?

답변

1

애니메이션을 올바른 셀로 다시 매핑하려면 어떻게해야합니까? 모든 셀에 동일한 공유 ID가 있습니다.

첫 번째 활동에는 두 번째 활동을 시작하는 항목을 지정하는 키가 있어야합니다. 의 고유 한 userIdUser이 있다고 가정 해 보겠습니다. 즉, 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()에서 두 번째 활동에서 전달한 BundleIntent으로 저장합니다 (단계 7 참조).
  5. onActivityReenter()에서 전환을 연기 한 후이 번들에 추가 한 정보를 기반으로 UI를 일부 변경합니다. 특히,이 번들에는 두 번째 활동을 시작한 UserInteger 키가 포함됩니다. 이 키로 목록에 User의 현재 위치를 찾고 RecyclerView을 새로운 위치로 스크롤 할 수 있습니다. 이 항목을 표시 한 후에 트리거를 누르고 시스템이 전환을 supportStartPostponedEnterTransition()까지 시작할 수 있습니다.
  6. SharedElementCallback::onMapSharedElements()에서 확인하십시오. 단계 4에서 저장 한 Bundle이 null인지 여부. null이 아니면 두 번째 활동에서 무언가를 만들었고 공유 요소가 다시 매핑되기를 원할 것입니다.두 번째 활동 오버라이드 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