-1

我有一个RecyclerView与填充项目(ImageView,2 x TextView)。在项目点击我开始一个新的Activity。我想使用材质转换,我想重新安排ImageViewRecycler项目材料转换不能正常工作

两个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所在的布局UserListLayoutitem_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片断

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

我觉得我失去了一些东西简单了 - 但直小时的编码用尽我的脑子不够好,不要看到它通过。请帮助我。

+0

您正在更改列表项目的过渡名称,但您的示例中没有任何内容可以指示目标“活动”视图的相同内容。 –

+0

我在创建片段中添加了目标活动,以显示如何通过Bundle设置过渡名称。我不想把所有的代码放在这里,因为人们通常会忽略更长的帖子。 –

+0

您是否检查'transitionName'是否包含目标'Activity'中正确位置索引的期望值(我想它是'UserDetailActivity')? –

回答

1

你的问题在于点击处理程序(openUserDetails(...)这样做,如果我是正确的)。

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar);是不会在这里工作,因为你有多个意见在你的布局中具有相同的ID R.id.iw_avatar。您可以执行以下操作来找到正确的ImageView实例:

  1. 传递选定视图(可能你itemViewUserVH)到openUserDetails(...)我猜你现在太
  2. 呼叫findViewById(...)上这个view参数找到实际的ImageView
+0

听起来像它可以工作,会测试并让你知道。感谢您的建议! –

+0

我已经在活动和适配器之间创建了一个接口,并在适配器中侦听了onClickEvents,其中我在item上搜索了getAdapterPosition(),然后在ViewHolder中搜索了ImageView。你的回答让我接受这个,所以我接受它。再次感谢! –