У меня есть 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?
Вы читали это http://www.androiddesignpatterns.com/2015 /01/activity-fragment-shared-element-transitions-in-depth-part3a.html? – pskink
@pskink Да, я потратил почти целый день на поиск точного решения, но не нашел рабочего решения, точно соответствующего моему требованию. Ссылка, которую вы опубликовали, хороша в целом для понимания основ перехода, но у нее нет ничего особенного для recyclerview, где она не работает. – Ankur
попробуйте это, если это вам понадобится: http://pastebin.com/yEh2urqp – pskink