Android 回收器物料转换无法正常工作
我有一个带有填充项的Android 回收器物料转换无法正常工作,android,animation,android-recyclerview,material-design,transition,Android,Animation,Android Recyclerview,Material Design,Transition,我有一个带有填充项的RecyclerView(ImageView,2xTextView)。在项目上单击“我启动一个新的活动”。我想使用材质转换,在这里我想重新排列ImageView 两个imageview共享相同的转换名称 问题:当我按下该项目时,动画开始工作,新活动开始转换,但如果我单击第一个项目下方的项目, 转换仍将在第一行开始和结束 TargetActivity片段 @Override protected void onCreate(@Nullable Bundle savedInstan
RecyclerView
(ImageView
,2xTextView
)。在项目上单击“我启动一个新的活动”
。我想使用材质转换,在这里我想重新排列ImageView
两个imageview
共享相同的转换名称
问题:当我按下该项目时,动画开始工作,新活动开始转换,但如果我单击第一个项目下方的项目,
转换仍将在第一行开始和结束
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);
}
我觉得我错过了一些简单的东西——但连续几个小时的编码已经让我的大脑精疲力竭,无法看穿它。请帮助我。您的问题在于单击处理程序(
openUserDetails(…)
如果我是正确的,它会这样做)
iwAvatar=ButterKnife.findById(这个,R.id.iw_化身)代码>在这里不起作用,因为在布局中有多个视图具有相同的IDR.ID.iw_avatar
。您可以执行以下操作以找到正确的ImageView
实例:
将所选视图(可能是UserVH
中的itemView
)传递给openUserDetails(…)
(我猜您现在也这样做了)
在此视图
参数上调用findViewById(…)
,以查找实际的图像视图
您正在更改列表项的转换名称,但您的示例中没有任何内容表明目标活动
视图的转换名称相同。我在“创建代码段”中添加了目标活动,以显示如何通过Bundle设置转换名称。我不想把所有的代码都放在这里,因为人们通常会忽略较长的帖子。您是否检查了transitionName
是否在您的目标Activity
(我猜它是UserDetailActivity
)中包含具有正确位置索引的预期值?确实如此。如果我将我的RecyclerClickListener仅隔离到ImageView(iw.setOnItemClickListener()),那么这样做非常好,但是在这种情况下,如果用户在行中的其他位置按下,则不会发生任何事情。如果按ImageView上的键,转换将正常工作。但我希望,即使用户按下TextView(静止图像视图应设置动画),转换也能工作。听起来它可以工作,将测试并让您知道。谢谢你的建议!我已经在activity和adapter之间创建了一个接口,并在adapter中侦听onClickEvents,在这里我可以对项执行getAdapterPosition(),然后在ViewHolder中搜索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);
}
}
}
@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);
}