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
,2x
TextView
)。在项目上单击“我启动一个新的
活动”
。我想使用材质转换,在这里我想重新排列
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_化身)在这里不起作用,因为在布局中有多个视图具有相同的ID
R.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);    
    }