当多个元素时,共享元素事务无法与 recyclerview 一起使用

shared element transaction not working with recyclerview when more than one element

android 应用程序中有一个 recyclerview,当用户转到其他片段时我想要共享元素事务,我按照下面的代码进行了尝试。

行中的图像视图 xml 文件

 <ImageView
    android:id="@+id/iv_album_thumbnail"
    android:layout_width="match_parent"
    android:layout_height="160dip"
    android:layout_gravity="center"
    android:transitionName="image_transit"
    android:scaleType="centerCrop"
    tools:ignore="ContentDescription"
    android:src="@drawable/img_default"
    android:gravity="center" />

第二个片段中的图像视图

<ImageView
    android:id='@+id/iv_album_thumbnail'
    android:layout_width="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_height="wrap_content"
    android:transitionName="image_transit"
    tools:ignore="ContentDescription,UnusedAttribute"
    android:layout_marginTop="60dip"
    android:layout_alignParentTop="true"
    android:src="@drawable/placeholder" />

点击方法

public void onAlbumClicked(RecyclerViewAdapter.ViewHolder holder, int position) {

    SongListFragment kittenDetails = SongListFragment.newInstance(aList.get(position));

    // Note that we need the API version check here because the actual transition classes (e.g. Fade)
    // are not in the support library and are only available in API 21+. The methods we are calling on the Fragment
    // ARE available in the support library (though they don't do anything on API < 21)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        kittenDetails.setSharedElementEnterTransition(new DetailsTransition());
        kittenDetails.setEnterTransition(new Fade());
        setExitTransition(new Fade());
        kittenDetails.setSharedElementReturnTransition(new DetailsTransition());
    }

    getActivity().getSupportFragmentManager()
            .beginTransaction()
            .addSharedElement(holder.imgPicture, "image_transit")
            .setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
            .replace(R.id.root, kittenDetails)
            .addToBackStack(null)
            .commit();
}

recyclerview 中只有一项时,它工作完美,但是当 recyclerview 中有多个项目时,根本没有效果,谁能告诉我。

我认为问题在于您在源视图树中有多个具有相同转换名称的视图。

您应该只在点击的行上设置它:

  • 从行 xml 中删除 android:transitionName 属性。
  • 添加ViewCompat.SetTransitionName(holder.imgPicture, "image_transit");