【发布时间】:2017-09-19 10:34:01
【问题描述】:
我有一个RecyclerView,其中包含已填充的项目(ImageView,2x TextView)。在项目点击我开始一个新的Activity。我想使用 Material 过渡,我想在其中重新排列 ImageView。
ImageViews 共享相同的转换名称。
问题:当我按下项目时,动画开始工作,新活动从过渡开始,但如果我点击 低于第一个项目的项目, 过渡仍将在第一行开始和结束。
@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 sn-p
@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);
}
我觉得我错过了一些简单的东西 - 但是连续几个小时的编码已经让我的大脑筋疲力尽,无法看穿它。请帮帮我。
【问题讨论】:
-
您正在更改列表项的过渡名称,但您的示例中没有任何内容表明目标
Activity的视图相同。 -
我在 create sn-p 上添加了目标活动,以展示我是如何通过 Bundle 设置过渡名称的。我不想把所有代码都放在这里,因为人们通常会忽略较长的帖子。
-
您是否检查了
transitionName是否在您的目标Activity中包含具有正确位置索引的预期值(我猜是UserDetailActivity)? -
确实如此。如果我仅将我的 RecyclerClickListener 隔离到 ImageView (iw.setOnItemClickListener()),这非常有效,但是在这种情况下,如果用户按下行中的其他位置,则不会发生任何事情。如果在 ImageView 上按下,则过渡按应有的方式工作。但我希望即使用户按下 TextView 也能进行转换(仍然 Imageview 应该动画)
标签: android animation android-recyclerview material-design transition