1

У меня есть одна активность с одной RecyclerView (библиотека SuperSlim) и активность элемента, когда я нажимаю элемент этого списка, активность детализации будет открыта. Проблема заключается в том, когда я вернусь, я пытаюсь установить щелкнул элемент в качестве первого видимого элемента в списке, но я получаю эту ужасную анимацию:Нежелательный эффект SharedElements в RecyclerView

enter image description here

Это мой onActivityReenter()

@Override 
public void onActivityReenter(int resultCode, Intent data) { 
    super.onActivityReenter(resultCode, data); 
    Log.d(TAG, "onActivityReenter() called with: resultCode = [" + resultCode + "], data = [" + data + "]"); 

    mTmpReenterState = new Bundle(data.getExtras()); 
    int startingPosition = mTmpReenterState.getInt(EXTRA_STARTING_ITEM_POSITION); 
    int currentPosition = mTmpReenterState.getInt(EXTRA_CURRENT_ITEM_POSITION); 

    mRecycler.scrollToPosition(currentPosition); 
    postponeEnterTransition(); 
    mRecycler.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      mRecycler.getViewTreeObserver().removeOnPreDrawListener(this); 
      // TODO: figure out why it is necessary to request layout here in order to get a smooth transition. 
      mRecycler.requestLayout(); 
      startPostponedEnterTransition(); 

      return true; 
     } 
    }); 
} 

И мой 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; 
     } 
    } 
}; 

Я думаю, что проблема заключается в том, что деятельность пытается сделать анимацию из исходного пункта позиция вверху списка, но я не знаю, как это избежать.

enter image description here

Кто-нибудь знает, как это исправить ??

Спасибо заранее, ребята !!!

ответ

1

Через некоторое время я понял, что проблема в том, что я обновляю список основных дел с notifyItemChanged(int) на LocalBroadcast, и стандартная анимация recyclerView сделала это сбой. Я решить эту проблему с помощью:

RecyclerView.setItemAnimator(null) 

потому что стандарт не работал

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

Так что проблема не имеет ничего общего с SharedElements.

Смежные вопросы