-1

J'ai un RecyclerView avec des éléments peuplés (ImageView, 2x TextView). Sur l'article cliquez sur je commence un nouveau Activity. Je veux utiliser la transition matérielle, où je veux ré-organiser le ImageView. Les deux ImageViews partagent le même nom de transition.Recycleur Élément La transition matérielle ne fonctionne pas correctement

NUMÉRO: Lorsque je presse l'article, des œuvres d'animation et nouvelle activité commence par la transition, mais si je clique sur les éléments qui sont en dessous du 1er point, la transition commence encore et se terminer à la première rangée.

@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()); 
} 

Le code ci-dessus est exécuté en SourceActivity et n'a pas de lien direct item_listXML mise en page. C'est pourquoi j'utilise Butterknife là, pour trouver le ImageView que je veux animer - cependant, cela semble saisir seulement le premier élément ImageView et non le ImageView qui a été réellement pressé.

Voici mon adapter class (je suppose qu'il me manque quelque chose ici). Dans cette classe ViewHolder j'ai référence à la mise en page UserListLayout (item_list) où se trouve ImageView.

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 snippet

@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);  
} 

Je me sens comme je manque quelque chose de simple - mais droites heures de codage épuisé mon cerveau assez bien, pour ne pas voir à travers. Sil te plait aide moi.

+0

Vous modifiez le nom de transition des éléments de liste, mais rien dans votre exemple n'indique la même chose pour la vue cible de l'activité. –

+0

J'ai ajouté l'activité cible sur l'extrait de création, pour montrer comment définir le nom de transition via Bundle. Je ne voulais pas mettre tout le code ici, car les gens ignorent généralement les messages plus longs. –

+0

Avez-vous vérifié si 'transitionName' contient la valeur attendue avec l'index de position correct dans votre cible' Activity' (je suppose que c'est UserDetailActivity')? –

Répondre

1

Votre problème réside dans le gestionnaire de clic (openUserDetails(...) fait-il si je me trompe).

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar); ne fonctionnera pas ici parce que vous avez plusieurs vues avec le même ID R.id.iw_avatar dans votre mise en page. Vous pouvez faire ce qui suit pour trouver l'instance ImageView correcte:

  1. passer le point de vue sélectionné (éventuellement votre itemView dans UserVH) à openUserDetails(...) (Je suppose que vous faites maintenant trop)
  2. Appel findViewById(...) sur ce view param pour trouver le ImageView réelle.
+0

Semble que cela pourrait fonctionner, va tester et vous faire savoir. Merci pour suggestion! –

+0

J'ai créé une interface entre l'activité et l'adaptateur et j'ai écouté onClickEvents à l'intérieur de l'adaptateur, où je coudl getAdapterPosition() sur l'élément, puis j'ai recherché ImageView dans le ViewHolder. Votre réponse m'a conduit à cela, donc je l'accepte. Merci encore! –