RecycleView项目转换为片段

时间:2018-02-09 08:54:08

标签: android android-fragments android-recyclerview android-transitions

我正在尝试创建从循环视图到片段的图像移动过渡。但问题是,在过渡图像显示在新的移动动画中后,它不会发生,它只会淡入其余的内容。我能做错什么?我跟着这个例子: http://mikescamell.com/shared-element-transitions-part-4-recyclerview/

我使用图片视图回收了视图项目布局:

<?xml ...?>
<layout ...>
    <data>
        <variable name="model" type="..."/>
    </data>
    <LinearLayout ...>
        <FrameLayout ...>
            <ImageView android:id="@+id/image" .../>
        </FrameLayout>
        <LinearLayout ...>
            ...
        </LinearLayout>
    </LinearLayout>
</layout>

然后我有一个片段布局,我想从循环视图中移动图像。

<FrameLayout ...>
    <TextView .../>
    <ImageView android:id="@+id/logo" >
</FrameLayout>

这里是回收我对onBindViewHolder方法的看法

@Override
public void onBindViewHolder(RecycleViewAdapter.ViewHolder holder, int position) {
    final T object = getItem(position);

    holder.getBinding().setVariable(BR.model, object);
    holder.getBinding().executePendingBindings();

    ViewCompat.setTransitionName(holder.getBaseView().findViewById(R.id.logo), "wb_logo");

    holder.getBaseView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListener.onItemClick(view, object);
        }
    });
}

这是我的主要活动中的回收视图项目点击处理程序

@Override
public void onFragmentItemClick(View view, Object object) {
    PreviewFragment fragment = PreviewFragment.newInstance(Object.imageId, "");
    getFragmentManager()
            .beginTransaction()
            .addSharedElement(view.getRootView().findViewById(R.id.logo), "wb_logo")
            .addToBackStack(null)
            .replace(R.id.fragment_container, fragment)
            .commit();
}

在我的片段类中,我不想为图像设置动画,我有以下设置:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    setSharedElementEnterTransition(
            TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = view.findViewById(R.id.logo);
    imageView.setTransitionName("wb_logo");
    imageView.setImageResource(...);
}

我尝试将transitionName属性静态添加到图像视图,但结果相同。

修改 也许我的总体布局有问题。我的片段容器位于DrawerLayout

<android.support.v4.widget.DrawerLayout ...>

    <android.support.design.widget.CoordinatorLayout ...>

        <android.support.design.widget.AppBarLayout ...>

            <android.support.v7.widget.Toolbar ... />

        </android.support.design.widget.AppBarLayout>

        <FrameLayout android:id="@+id/fragment_container" .../>

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView .../>

</android.support.v4.widget.DrawerLayout>

我正在使用的片段类我正在使用

android.app.Fragment 

而不是

android.support.v4.app.Fragment

android.support.v7.app.AppCompatActivity

2 个答案:

答案 0 :(得分:1)

我弄清楚我的问题是什么:我在循环视图中有多个项目,其中都有使用android的imageView:transitionName =&#34; wb_logo&#34;。

我不知何故错过了循环视图中的每个共享项必须具有唯一的transitionName。当我修改transitionName以包含id后缀时,它开始按预期工作。

android:transitionName="wb_logo_1"

android:transitionName="wb_logo_2"

答案 1 :(得分:0)

尝试在xml而不是JAVA端设置转换名称。我认为它可能无法正常工作,因为您在创建视图时进行设置。

 <ImageView
    android:id="@+id/ivItem"
    android:transitionName="wb_logo"
    android:layout_width="match_parent"
    android:background="@android:color/holo_blue_bright"
    android:scaleType="centerCrop"
    android:layout_height="wrap_content" />

以上内容将出现在您的回收商视图中。

            <ImageView
                android:id="@+id/wb_logo"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                android:transitionName="wb_logo" />

上面会出现在你的片段中

您的开始片段代码是正确的