Android:RecyclerView和Fragment

时间:2016-04-14 20:57:32

标签: android android-fragments android-5.0-lollipop

我有以下设置:一个MainActivity,一个AFragment,它有一个RecyclerView和一个BFragment,用于包含AFragment中元素的细节。当用户点击AFragment中的项目时,它会将它们带到BFragment。

我想要创建的效果是为AFragment中的项目获取ImageView并将其转换为BFragment。

问题是,目前,对于RecyclerView“第一页”上的所有项目(“第一页”我指的是您在第一次进入AFragment时可以在屏幕上看到的所有项目),进入过渡到BFragment根本不起作用。但是当从BFragment返回到AFragment时,转换正常。对于RecyclerView中的所有其他项目(即不在“第一页”上的项目),进入和退出过渡都可以完美地进行。

我的代码

AFragment

public class AFragment extends Fragment {
    ...
    public static class ItemAdapter extends RecyclerView.Adapter<ViewHolder> {
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            final Item info = items.get(position);
            ViewCompat.setTransitionName(holder.imageView, "shared_image_" + info.getId());

            holder.imageView.setImageDrawable(info.getIcon());
            holder.name.setText(info.getName());
            holder.rootView.setTag(info.getId());

            holder.rootView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    BFragment frag = BFragment.newInstance((Integer) v.getTag());
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        frag.setSharedElementEnterTransition(new ComboTransition());
                        frag.setEnterTransition(new Fade());
                        setExitTransition(new Fade());
                        frag.setSharedElementReturnTransition(new ComboTransition());

                        Log.d(TAG, "Name: " + imageView.getTransitionName());
                    }


                    getFragmentManager().beginTransaction()
                        .addSharedElement(imageView, "shared_image")
                        .replace(R.id.content, frag)
                        .addToBackStack(null)
                        .commit();
                }
            });
        }                   
    }
    ...     
}

BFragment

public class BFragment extends Fragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ...
        ImageView imageView = (ImageView) findViewById(R.id.image_view);
        ViewCompat.setTransitionName(imageView, "shared_image");
        ...
    }
    ...     
}

1 个答案:

答案 0 :(得分:1)

URG。我发现了问题,这是我的应用程序独有的。问题是我忘了我在BFragment中有另一个RecyclerView副本(原因是我希望用户能够在BFragment中搜索AFragment中的所有项目,因此UX更好一些)。所以发生的事情是,当用户退出AFragment并进入BFragment时,BFragment中的recyclelerview将被初始化,因此“第一页”上的所有项目也会被初始化,其具有与AFragment中的项目相同的转换名称(因此奇怪的行为)与“第一页”上的项目。当然这非常糟糕,因为现在两个项目具有相同的转换名称。

我通过更改ItemAdapter的构造函数来解决问题,以获取创建者唯一的密钥,并将此密钥添加到所有转换名称前面。