2017-04-03 126 views
1

在我的項目中,我使用RecyclerView來顯示帶有縮略圖的項目列表。當用戶點擊一個項目時,DetailView被打開,圖像顯示在頂部。我試圖分享這些片段之間的一些元素,但轉換僅在輸入詳細片段時起作用,而不是在從中返回時起作用。Android共享元素片段轉換:返回轉換不起作用

在我ListAdapter我設置TransitionName,當用戶點擊一個項目通知ListFragment:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     viewHolder.image.setTag(Constants.SHARED_NAME_IMAGE + item.itemId); 
} 

單擊事件:

@OnClick(R.id.root) 
public void onClickedItem() { 
     List<Pair<View, String>> sharedElements = new ArrayList<>(); 
     sharedElements.add(new Pair<View, String>(image, (String) image.getTag())); 
     interactionListener.onItemSelected(data.get(getAdapterPosition() - headerItemCount).type, data.get(getAdapterPosition() - headerItemCount).itemId, sharedElements); 
} 

然後在ListFragment我開始了DetailFragment:

public void navigateToFragment(Fragment curFragment, Fragment nextFragment, 
           boolean addToBackStack, List<Pair<View, String>> sharedElements) { 
    if (nextFragment == null) { 
     return; 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && sharedElements != null && curFragment != null) { 
     // Setup transition on first fragment 
     curFragment.setSharedElementEnterTransition(TransitionUtil.getReturnTransition(this)); 
     curFragment.setSharedElementReturnTransition(TransitionUtil.getEnterTransition(this)); 
     curFragment.setEnterTransition(null); 
     curFragment.setExitTransition(null); 

     // Setup transition on second fragment 
     nextFragment.setSharedElementEnterTransition(TransitionUtil.getEnterTransition(this)); 
     nextFragment.setSharedElementReturnTransition(TransitionUtil.getReturnTransition(this)); 
     nextFragment.setEnterTransition(null); 
     nextFragment.setExitTransition(null); 

     // Add second fragment by replacing first 
     FragmentTransaction ft = getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.container, nextFragment); 
     if (addToBackStack) { 
      ft.addToBackStack("fragment"); 
     } 

     for (Pair<View, String> sharedElement : sharedElements) { 
      ViewCompat.setTransitionName(sharedElement.first, sharedElement.second); 
      ft.addSharedElement(sharedElement.first, sharedElement.second); 
     } 

     // Apply the transaction 
     ft.commit(); 
    } else { 
     FragmentTransaction ft = getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.container, nextFragment); 
     if (addToBackStack) { 
      ft.addToBackStack("fragment"); 
     } 
     ft.commit(); 
    } 
} 

Finally我設置了當前過渡名稱在DetailFragment的onCreateView()(因爲它取決於條目標識):

ViewCompat.setTransitionName(header, Constants.SHARED_NAME_IMAGE + itemId); 

回答

1

我只是解決了這個問題:有兩個問題:

  1. 我已經覆蓋我的名單適配器(因此過渡名字已被刪除)
  2. 我沒有onBindViewHolder

設置轉換名稱要解決#1 I C忌用setUpList(){...}喜歡這裏(如果是重要的第一!):

private void setupList() { 
    if (adapter != null) { 
     list.setAdapter(adapter); 
     linearLayoutManager = new LinearLayoutManager(getActivity()); 
     list.setLayoutManager(linearLayoutManager); 
     setScrollListener(); 
     return; 
    } 

    refreshLayout.setColorSchemeColors(ResourcesCompat.getColor(getResources(), R.color.main_color_2, getActivity().getTheme())); 
    refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      loadList(true); 
     } 
    }); 

    adapter = new ListAdapter((int) (DisplayUtils.getWidth(getActivity()) * 0.6), this); 
    list.setAdapter(adapter); 

    linearLayoutManager = new LinearLayoutManager(getActivity()); 
    list.setLayoutManager(linearLayoutManager); 

    refreshLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      refreshLayout.setRefreshing(true); 
      loadFilterItems(); 

要解決#2我剛剛更換setTag(..)setTransitionName(..)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       vh.image.setTransitionName(Constants.SHARED_NAME_IMAGE + item.itemId); 
      } 

,並在我的onClick方法:

List<Pair<View, String>> sharedElements = new ArrayList<>(); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      sharedElements.add(new Pair<View, String>(image, image.getTransitionName())); 
     } 
interactionListener.onItemSelected(data.get(getAdapterPosition() - headerItemCount).type, data.get(getAdapterPosition() - headerItemCount).itemId, sharedElements); 
相關問題