我想在RecyclerView和Viewpager之间实现一个包含共享元素转换的新闻应用。我的应用程序具有以下结构:
RecyclerView
。此列表的每个元素都包含ImageView
(共享元素项)和新闻标题。到目前为止,没有问题。图片会在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();
}
如果您需要更多代码,请告诉我们。谢谢你的帮助。