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_list
XML
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.
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é. –
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. –
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')? –