-1

RecyclerView에 채워진 품목 (ImageView, 2x TextView)이 있습니다. 항목을 클릭하면 새로운 Activity이 시작됩니다. Material transition을 사용하고 싶습니다. ImageView을 다시 배열하고 싶습니다.Recycler Item 재료 전이가 올바르게 작동하지 않습니다.

모두 ImageViews은 동일한 전환 이름을 공유합니다.

문제 :이 항목을 누르면는, 애니메이션 작품과 새로운 활동이 전환 시작,하지만 난 1 항목 아래에있는 항목 을 클릭하면, 전환이 아직 시작하고 처음에 종료됩니다 행.

@Override 
public void openUserDetails(UiBaseUser data, View view, int position) { 
    iwAvatar = ButterKnife.findById(this, R.id.iw_avatar); 

    Pair<View, String> p1 = Pair.create(iwAvatar, "avatar"); 
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat 
      .makeSceneTransitionAnimation(this, p1); 
    startActivity(UserDetailActivity.getIntent(getApplicationContext(), data), optionsCompat.toBundle()); 
} 

위의 코드는 SourceActivity에서 실행되고 item_listXML 레이아웃에 대한 직접 링크를 가지고 있지 않습니다. 그래서 Butterknife을 사용하여 애니메이션하려는 ImageView을 찾습니다. 그러나 이것은 실제로 눌러 진 ImageView이 아닌 첫 번째 요소 인 ImageView을 잡는 것처럼 보입니다.

여기 내 adapter class입니다. 여기에 뭔가 빠져 있다고 가정합니다. 이 ViewHolder 클래스에서 나는 ImageView이있는 UserListLayout (item_list) 레이아웃에 대한 참조를 가지고 있습니다.

public class UsersAdapter extends BaseAdapter<UiBaseUser, UsersAdapter.UserVH> { 

    private final LayoutInflater layoutInflater; 

    public UsersAdapter(Context context) { 
     this.layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public UserVH onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new UserVH(layoutInflater.inflate(R.layout.item_users, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(UsersAdapter.UserVH holder, int position) { 
     ViewCompat.setTransitionName(holder.layout.getIwAvatar(), "image_view_" + position); 
     holder.onBind(getItem(position)); 
    } 

    public class UserVH extends RecyclerView.ViewHolder { 

     private UserListLayout layout; 

     public UserVH(View itemView) { 
      super(itemView); 
      layout = (UserListLayout) itemView; 
     } 

     public void onBind(UiBaseUser item) { 
      layout.bind(item); 
     } 

    } 
} 

는 TargetActivity 내가 간단하게 뭔가를 놓친 거지 같은 느낌

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_user_detail); 
    ButterKnife.bind(this); 
    initializeDagger(); 

    bundle = getIntent().getExtras(); 

    if (bundle != null) { 
     transitionName = bundle.getString(EXTRA_TRANSITION_NAME); 
     presenter.onCreate(baseData); 
    } else { 
     throw new IllegalStateException("Initial bundle in UserDetail Activity is null"); 
    } 

    iwAvatar.setTransitionName(transitionName);  
} 

니펫을 -하지만 내 뇌가 충분히 소진 코딩의 연속 시간, 그것을 통해 볼 수 있습니다. 제발 도와주세요.

+0

목록 항목의 전환 이름은 변경되지만 대상 '활동'보기에 대해 동일한 항목을 표시하는 샘플은 없습니다. –

+0

Bundle을 통해 전환 이름을 설정하는 방법을 보여주기 위해 create snippet에 target 활동을 추가했습니다. 나는 사람들이 보통 더 긴 포스트를 무시하기 때문에, 여기에 모든 코드를 넣고 싶지 않았다. –

+0

'transitionName'이 타겟'Activity'의 정확한 위치 인덱스를 가진 기대 값을 포함하는지 확인 했습니까 ('UserDetailActivity'라고 생각합니다)? –

답변

1

클릭 핸들러에 문제가 있습니다 (openUserDetails(...) 제가 맞다면).

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar);은 레이아웃에서 동일한 ID가 R.id.iw_avatar 인보기가 여러 개 있기 때문에 여기서는 사용할 수 없습니다. 당신은 올바른 ImageView 예를 찾기 위해 다음을 수행 할 수

  1. 선택한보기를 통과 (아마도 당신의 itemViewUserVH에서) openUserDetails(...)에 (당신이 할 생각을하는 지금 너무)
  2. 전화 findViewById(...)에 이 view 매개 변수를 찾으려면 실제 ImageView을 찾으십시오.
+0

작동 할 수있는 것처럼 들리며 테스트하고 알립니다. 제안에 감사드립니다! –

+0

저는 액티비티와 어댑터 사이의 인터페이스를 만들고 어댑터 안의 onClickEvents를 청취했습니다. 어댑터에서 항목에 대해 getAdapterPosition()을 실행 한 다음 ViewHolder 내에서 ImageView를 검색했습니다. 당신의 대답이 나를 그렇게 이끌어주었습니다. 다시 한 번 감사드립니다! –

관련 문제