Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SharedElements在RecyclerView中的不良影响_Android_Android Recyclerview_Shared Element Transition_Superslim - Fatal编程技术网

Android SharedElements在RecyclerView中的不良影响

Android SharedElements在RecyclerView中的不良影响,android,android-recyclerview,shared-element-transition,superslim,Android,Android Recyclerview,Shared Element Transition,Superslim,我有一个带有一个RecyclerView(SuperSlim库)的活动和一个详细活动,当我单击该列表中的一个项目时,详细活动将打开。问题是,当我返回时,我试图将单击的元素设置为列表中的第一个可见元素,但我得到了一个可怕的动画: 这是我的onActivityReenter() 和我的SharedElementCallback: private final SharedElementCallback exitTransitionCallBack = new SharedElementCal

我有一个带有一个RecyclerView(SuperSlim库)的活动和一个详细活动,当我单击该列表中的一个项目时,详细活动将打开。问题是,当我返回时,我试图将单击的元素设置为列表中的第一个可见元素,但我得到了一个可怕的动画:

这是我的onActivityReenter()

和我的SharedElementCallback:

    private final SharedElementCallback exitTransitionCallBack = new SharedElementCallback() {
    @Override
    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

        if (mTmpReenterState == null) {
            // If mTmpReenterState is null, then the activity is exiting.
            View navigationBar = findViewById(android.R.id.navigationBarBackground);
            View statusBar = findViewById(android.R.id.statusBarBackground);
            if (navigationBar != null) {
                names.add(navigationBar.getTransitionName());
                sharedElements.put(navigationBar.getTransitionName(), navigationBar);
            }
            if (statusBar != null) {
                names.add(statusBar.getTransitionName());
                sharedElements.put(statusBar.getTransitionName(), statusBar);
            }
        } else {
            int startingPosition = mTmpReenterState.getInt(EXTRA_STARTING_ITEM_POSITION);
            int currentPosition = mTmpReenterState.getInt(EXTRA_CURRENT_ITEM_POSITION);
            if (startingPosition != currentPosition) {
                // If startingPosition != currentPosition the user must have swiped to a
                // different page in the DetailsActivity. We must update the shared element
                // so that the correct one falls into place.
                sharedElements.clear();
                sharedElements.put("number", mLayoutManager.findViewByPosition(currentPosition).findViewById(R.id.text_number));
                sharedElements.put("day", mLayoutManager.findViewByPosition(currentPosition).findViewById(R.id.text_day));
                sharedElements.put("recycler", mLayoutManager.findViewByPosition(currentPosition + 1).findViewById(R.id.recycler));
            }

            mTmpReenterState = null;
        }
    }
};
private final SharedElementCallback exitTransitionCallBack=new SharedElementCallback(){
@凌驾
在MapSharedElements(列表名称、映射sharedElements)上的公共void{
如果(mTmpReenterState==null){
//如果mTmpReenterState为null,则该活动正在退出。
View navigationBar=findViewById(android.R.id.navigationBarBackground);
视图状态栏=findViewById(android.R.id.statusBarBackground);
如果(导航栏!=null){
add(navigationBar.getTransitionName());
sharedElements.put(navigationBar.getTransitionName(),navigationBar);
}
如果(状态栏!=null){
name.add(statusBar.getTransitionName());
sharedElements.put(statusBar.getTransitionName(),statusBar);
}
}否则{
int startingPosition=mTmpReenterState.getInt(额外启动项位置);
int currentPosition=mTmpReenterState.getInt(额外当前项目位置);
if(起始位置!=当前位置){
//如果startingPosition!=currentPosition,则用户必须已刷到
//DetailsActivity中的不同页面。我们必须更新共享元素
//这样正确的一个就就位了。
sharedElements.clear();
sharedElements.put(“number”,mLayoutManager.findViewByPosition(currentPosition).findViewById(R.id.text_number));
sharedElements.put(“天”,mLayoutManager.findViewByPosition(currentPosition.findViewById(R.id.text_-day));
sharedElements.put(“回收者”,mLayoutManager.findViewByPosition(currentPosition+1.findViewById(R.id.recycler));
}
mTmpReenterState=null;
}
}
};
我认为问题在于活动试图制作从原始项目位置到列表顶部的动画,但我不知道如何避免这种情况

有人知道如何解决这个问题吗


提前谢谢大家

过了一会儿,我意识到我用
LocalBroadcast
notifyItemChanged(int)
更新主要活动列表的问题,以及标准的
recyclerView
动画造成了这个小故障。我使用以下方法解决问题:

  RecyclerView.setItemAnimator(null) 
因为标准不起作用

  ((SimpleItemAnimator) RecyclerView.getItemAnimator())
                          .setSupportsChangeAnimations(false)
因此,问题与
SharedElements
无关

  ((SimpleItemAnimator) RecyclerView.getItemAnimator())
                          .setSupportsChangeAnimations(false)