Android:使用RecyclerView和Viewpager进行共享元素转换

时间:2016-03-23 16:48:41

标签: android android-viewpager android-recyclerview shared-element-transition

我想在RecyclerView和Viewpager之间实现一个包含共享元素转换的新闻应用。我的应用程序具有以下结构:

  • Activity1显示RecyclerView。此列表的每个元素都包含ImageView(共享元素项)和新闻标题。
  • Activity2使用大图片(相反的共享元素项)显示此新闻的详细信息页面
  • 单击Activity1中的某个新闻项时,共享元素转换应该开始并将图像展开为大图像,显示在Activity2中。

到目前为止,没有问题。图片会在EnterTransition处展开,并在ReturnTransition处最小化。现在复杂点。我想在Activity2中实现一个ViewPager,以便用户能够在新闻之间滑动,这些信息显示在自动收报机中。

在我实现了Viewpager之后,EnterTransition仍然可以正常工作,但现在ReturnTransition被破坏了。这种破坏的过渡是在以下情况下造成的: - 用户按下自动收报机元素1(或任何其他),启动到活动2的共享元素转换。 - 显示Activity2。用户通过新闻滑动,直到位置20并按下后退按钮。 - 显然,位于20的共享元素图像目前在recyclerview中不可见,因此ReturnTransition无法正常工作。

我尝试在Activity1的onActivityReenter中设置recyclerview的当前位置。如果我现在从Activity2返回,则上次访问的新闻元素是recyclerview中的第一个可见项,但是带有共享元素的ReturnTransition仍然无效。

任何人都知道如何摆脱这个问题?您可以在下面找到我的代码:

Activity1中的OnActivityReenter

@Override
public void onActivityReenter(int requestCode, Intent data) {
    super.onActivityReenter(requestCode, data);

    if(requestCode == Constants.NEWSDETAIL_ACTIVITY_RESULT_OK) {

        mIsReentering = true;
        mTransitionBundle = new Bundle(data.getExtras());

        int oldPosition = mTransitionBundle.getInt(Constants.ACTIVITY_TRANSITION_OLD_ITEM_POS);
        int currentPosition = mTransitionBundle.getInt(Constants.ACTIVITY_TRANSITION_CURRENT_ITEM_POS);


        if(oldPosition != currentPosition) {

            //Scrolls to new position in the recyclerview
            scrollToNews(currentPosition + 1);
        }
    }
}

Activity2中的FinishAfterTransition

@Override
public void finishAfterTransition() {
    mIsReturning = true;

    if(BasicHelper.isLollipop()) {
        getWindow().setReturnTransition(new Slide());
    }

    int currentPosition = -1;
    //gets current position of viewpager
    if(currentlyAttached instanceof NewsDetailViewpagerFragment) {
        currentPosition = ((NewsDetailViewpagerFragment) currentlyAttached).getCurrentPosition();
    }

    Intent data = new Intent();
    data.putExtra(Constants.ACTIVITY_TRANSITION_OLD_ITEM_POS, getIntent().getExtras().
            getInt(Constants.ACTIVITY_TRANSITION_CURRENT_ITEM_POS));
    data.putExtra(Constants.ACTIVITY_TRANSITION_CURRENT_ITEM_POS, currentPosition);
    setResult(Constants.NEWSDETAIL_ACTIVITY_RESULT_OK, data);
    super.finishAfterTransition();
}

如果您需要更多代码,请告诉我们。谢谢你的帮助。

0 个答案:

没有答案