9

У меня есть 2 фрагмента: фрагмент 1, содержащий recyclerview & фрагмент 2, имеющий подробный вид для выбранного элемента. Между этими двумя фрагментами есть общий вид изображения элементов. При переходе от фрагмента 1 к 2 я хочу видеть стандартный эффект перехода общего элемента, но он, похоже, не работает с recyclerview. Потому что, если я использую только один отдельный вид в первом фрагменте вместо recyclerview, он имеет правильный переход. Обратите внимание, что я назначил уникальные имена переходов на основе позиции для повторного просмотра изображений элементов.Переход общего элемента Android между фрагментами, имеющими recyclerview & detail view

код выглядит следующим образом: MyActivity.java

public class MyActivity extends Activity { 

private static final String TAG = MyActivity.class.getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 
    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .add(R.id.main_container, new PlaceholderFragment()) 
       .commit(); 
    } 
} 

public static class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> { 
    public interface OnItemClickListener { 
     void onItemClick(View view, int position); 
    } 

    private OnItemClickListener mItemClickListener; 

    List<Integer> items = new ArrayList<Integer>(); 
    public void setOnItemClickListener(OnItemClickListener listener) { 
     this.mItemClickListener = listener; 
    } 


    public ImageAdapter() { 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
     items.add(1); 
    } 

    @Override 
    public ImageAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, null); 
     ViewHolder viewHolder = new ViewHolder(view); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, final int i) { 
     viewHolder.container.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       if (mItemClickListener != null) { 
        mItemClickListener.onItemClick(view, i); 
       } 
      } 
     }); 
     viewHolder.imgDummy.setTransitionName("test" + i); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public View container; 
     public View imgDummy; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      container = itemView.findViewById(R.id.container); 
      imgDummy = itemView.findViewById(R.id.imgDummy); 
     } 
    } 
} 
/** 
* A placeholder fragment containing a simple view. 
*/ 
@SuppressLint("ValidFragment") 
public class PlaceholderFragment extends Fragment { 

    private RelativeLayout.LayoutParams lp; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_my, container, false); 
     final View imgDummy2 = rootView.findViewById(R.id.imgDummy2); 
     imgDummy2.setTransitionName("test"); 

     RecyclerView list = (RecyclerView) rootView.findViewById(R.id.streams_list); 
     list.setLayoutManager(new LinearLayoutManager(getActivity())); 
     ImageAdapter adapter = new ImageAdapter(); 
     adapter.setOnItemClickListener(new ImageAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) {     
       View imgDummy = view.findViewById(R.id.imgDummy); 

       SecondFragment secondFragment = new SecondFragment(); 
       secondFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.trans_move)); 

       secondFragment.setId(imgDummy.getTransitionName()); 
       android.app.FragmentTransaction trans = getFragmentManager().beginTransaction(); 
       trans.replace(R.id.main_container, secondFragment); 
       trans.addToBackStack(null); 
       trans.addSharedElement(imgDummy, imgDummy.getTransitionName()); 
       trans.commit(); 
      } 
     }); 
     list.setAdapter(adapter); 

     return rootView; 
    } 
} 

public static class SecondFragment extends Fragment { 
    private String mId; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.second_fragment, container, false); 
     rootView.findViewById(R.id.imgDummy).setTransitionName(mId); 
     return rootView; 
    } 

    public void setId(String id) { 
     mId = id; 
    } 
} 
} 

Если изменить следующие 2 строки:

secondFragment.setId(imgDummy.getTransitionName()); 
trans.addSharedElement(imgDummy, imgDummy.getTransitionName()); 

от

secondFragment.setId(imgDummy2.getTransitionName()); 
trans.addSharedElement(imgDummy2, imgDummy2.getTransitionName()); 

тогда я могу видеть imgDummy2 изображение, переходящих правильно , вероятно, потому, что он находится за пределами recyclerview.

Любая идея, как я могу применить ее также в recyclerview?

+0

Вы читали это http://www.androiddesignpatterns.com/2015 /01/activity-fragment-shared-element-transitions-in-depth-part3a.html? – pskink

+1

@pskink Да, я потратил почти целый день на поиск точного решения, но не нашел рабочего решения, точно соответствующего моему требованию. Ссылка, которую вы опубликовали, хороша в целом для понимания основ перехода, но у нее нет ничего особенного для recyclerview, где она не работает. – Ankur

+0

попробуйте это, если это вам понадобится: http://pastebin.com/yEh2urqp – pskink

ответ

1

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

попробуйте изменить imgDummy.getTransitionName()) в следующей строке

trans.addSharedElement(imgDummy, imgDummy.getTransitionName()); 

с именем перехода ImageView в fragmentB