2017-04-03 6 views
1

私のプロジェクトでは、RecyclerViewを使用してサムネイル付きアイテムのリストを表示しています。ユーザーが項目をクリックするとDetailViewが開かれ、画像が上部に表示されます。私はこのフラグメント間でいくつかの要素を共有しようとしていますが、は、詳細フラグメントを入力するときにのみ動作し、出力するときは動作しません。私ListAdapterAndroid共有要素フラグメントトランジション:リターントランジションが動作しない

私はTransitionNameを設定し、ユーザーがアイテムをクリックしたときListFragmentに通知:ListFragmentに私が始めてその後

@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); 
} 

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

クリックイベント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(); 
    } 
} 

最後に(それはのitemIdに依存する)私はDetailFragmentのonCreateView()に現在のトランジション名を設定しています:

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

答えて

1

私はちょうど問題を解決:

  1. 私が上書きされました:2つの問題がありました私のリストアダプター(したがって、遷移名が削除されている)
  2. 私は#1 I Cを解決するにはonBindViewHolder

に遷移名を設定していませんここのようsetUpList(){...}絞首刑(重要である場合には、第1!):

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); 

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を解決するために、私はちょうどsetTransitionName(..)

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

で、私のonClickメソッドでsetTag(..)を置き換えます

関連する問題