两个ViewPager之间的ActivityTranstition,它们都包含适配器

时间:2015-04-28 07:23:03

标签: android android-fragments android-activity android-animation material-design

我有些绝望需要帮助,所以请抓住你的帽子,因为我们走了:

我有两项活动需要在两者之间进行转换。每个活动都包含一个ViewPager,每个ViewPager都有一个PagerAdapter,负责创建我可以在其间切换的片段。

在活动中 A 我有一个包含一个大图像的片段。在活动中 B 我有一个包含RecyclerGridView的片段,其中包含一个网格ImageView的' S

所以我希望归档的过渡:
活动 A - > PagerAdapter - >片段 - > ImageView
活动 b - > PagerAdapter - >片段 - > RecyclerView - > ImageView的

我知道我必须使用postponeEnterTransition();startPostponedEnterTransition();,但我无法确定何时致电startPostponedEnterTransition();以确保时机正确。

活动 A 我在哪里开始活动 B

Intent intent = new Intent(this, PagesOverviewActivity.class);
if (Build.VERSION_CODES.LOLLIPOP <= Build.VERSION.SDK_INT) {
   final PageRecyclingImageView pageRecyclingImageView = ((PageDetailFragment) mAdapter.getFragment(mPager.getCurrentItem())).getPageRecyclingImageView();
   ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(PageActivity.this, pageRecyclingImageView, "page_number_" + getCurrentPageNumber());
   startActivity(intent, options.toBundle());
}

活动中的OnCreate B 我调用postponeTransition并创建名为 PagesOverviewFragmentAdapter 的PagerAdapter

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    postponeEnterTransition();
    ...
    mFragmentAdapter = new PagesOverviewFragmentAdapter(getSupportFragmentManager(), sections, getApplicationContext());
    mViewPager.setAdapter(mFragmentAdapter);

在我的PagesOverviewFragmentAdapter.getItem()我创建了包含RecyclerView的片段

public class PagesOverviewFragmentAdapter extends FragmentPagerAdapter {

@Override
public Fragment getItem(int position) {
    PagesOverviewFragment fragment = PagesOverviewFragment.newInstance();

    return fragment;
}

PagesOverviewFragment 中,我为我的RecyclerView创建适配器 PagesOverviewAdapter

public class PagesOverviewFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.pages_overview_fragment_layout, container, false);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.pages_overview_recycler_view);
    mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    mAdapter = new PagesOverviewAdapter(mSection, getActivity());
    mRecyclerView.setAdapter(mAdapter); 
    return view;

最后在 PagesOverviewAdapter 内部,我创建了ImageView,当我点击想要制作动画的imageView时,我想转换到并调用startPostponedEnterTransition

@Override
public void onBindViewHolder(final PagesOverviewViewHolder holder, int position) {
    int leftPagePosition;    
    leftPagePosition = mSection.getFirstPage();
    if (Build.VERSION_CODES.LOLLIPOP <= Build.VERSION.SDK_INT) {
        holder.mLeftCardView.setTransitionName("page_number_" + leftPagePosition);
    }

    Glide.with(mContext).load(getLocalPathToFile(leftPagePosition)).placeholder(R.drawable.card_cover_placeholder).into(holder.mLeftCardView);
    holder.mLeftCardView.setText(mContext.getString(R.string.page, leftPagePosition));
    if (leftPagePosition == 4) { //Hardcode position 4 for test.
        holder.mLeftCardView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                mActivity.startPostponedEnterTransition();
                holder.mLeftCardView.getViewTreeObserver().removeOnPreDrawListener(this);
                return false;
            }
        });
   }
}

现在应该完成文字墙!
以下是我的应用中的外观视频:
http://www.youtubeslow.com/watch?v=crdRjDTy43o
当我按下后退按钮时你可以看到转换工作,所以两个imageView都有正确的转换名称,但当我启动Activity B 时,imageView在我的RecyclerView中转到了错误的位置

如果有人知道如何解决这个问题,我会找到你并拥抱你!

0 个答案:

没有答案