-1

私は人口が多いアイテム(、2x TextView)を持つRecyclerViewを持っています。アイテムをクリックすると、新しいActivityが開始されます。私は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クラスでは、UserListLayoutitem_list)の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は、私はシンプルなものを逃していますように私は感じ

@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を使って遷移名を設定する方法を示すために、create snippetにtargetアクティビティを追加しました。人々は通常より長い記事を無視するので、私はここにすべてのコードを入れたくありませんでした。 –

+0

'transitionName'にあなたのターゲット' Activity'(あなたは 'UserDetailActivity'だと思います)の正しい位置インデックスを持つ期待値を含んでいるかどうかチェックしましたか? –

答えて

1

あなたの問題はクリックハンドラの中にあります(openUserDetails(...)私が正しい場合はそれを行います)。

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar);は、あなたのレイアウトに同じIDのR.id.iw_avatarの複数のビューがあるため、ここでは機能しません。

  1. にコールfindViewById(...)
  2. 私はあなたが今、あまりにもことをやると思います)openUserDetails(...)に選択したビュー(UserVHでおそらくあなたitemView)を渡します。あなたは正しいImageViewインスタンスを検索するには、次を行うことができますこのview paramを実際に見つけるにはImageView
+0

うまくいくかのように聞こえ、テストしてお知らせします。提案ありがとう! –

+0

私はアクティビティとアダプタの間のインタフェースを作成し、アダプタ内のonClickEventsをリッスンしました。ここでは、アイテムに対してgetAdapterPosition()を実行し、ViewHolder内でImageViewを検索しました。あなたの答えは私にこれを導いたので、私はそれを受け入れます。再度、感謝します! –

関連する問題