android - recyclerview 中的项目(在一个片段中)到另一个带有 recyclerview 的片段的共享元素转换不起作用(效果为 Whatsapp 图像)
问题描述
我已经浏览了一半的互联网,并且尝试了所有可能的转换,但我无法获得与 whatsapp 对图像组所做的相同效果(当有 +4 时)。
我正在用androidx做,我认为这不是问题。
我想要什么:Whatsapp 示例
我发现但对我不起作用的内容,因为它们与活动有关:活动示例
我的效果:我的效果不起作用
代码片段:
片段A(持有人点击):
// imageView is the view inside of itemView of viewholder in chat, view is the viewholder
private void openMediaListWithTransition(ImageView imageView, int imagePosition, int messagePosition, View view) {
String transitionName = imageView.getTransitionName();
ImageListFragment imageListFragment = ImageListFragment.newInstance(requireContext(),
((ChatAdapter.MessageMultiMedia) adapter.getMessageAt(
messagePosition)).getMessages(), imagePosition, messagePosition, "TRANSITION");
//imageListFragment.setEnterTransition(new Fade());
//imageListFragment.setSharedElementEnterTransition(new DetailsTransition());
//imageListFragment.setEnterTransition(new Fade());
//setExitTransition(new Fade());
//imageListFragment.setSharedElementReturnTransition(new DetailsTransition());
imageView.setTransitionName("TRANSITION");
ViewCompat.setTransitionName(imageView, "TRANSITION");
getParentFragmentManager()
.beginTransaction()
.setReorderingAllowed(true)
.addSharedElement(imageView, "TRANSITION")
.replace(R.id.rlChat, imageListFragment)
.addToBackStack(null)
.commit();
getParentFragmentManager().setFragmentResultListener("XD", getViewLifecycleOwner(), (requestKey, result) -> {
getParentFragmentManager().beginTransaction().remove(imageListFragment).commit();
});
}
回收站的 ViewHolder 说明 FRAGMENT A: 说明
片段 B:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
binding = FragmentImagesListBinding.inflate(inflater);
starterPosition = getArguments().getInt(ITEM_POSITION);
messagePosition = getArguments().getInt(MESSAGE_POSITION);
postponeEnterTransition();
prepareRecycler();
}
@SuppressLint("NotifyDataSetChanged")
private void prepareRecycler() {
ImageListAdapter adapter = new ImageListAdapter(messagePosition, this);
adapter.setMessagesList(
GSON.fromJson(getArguments().getString(MESSAGE_LIST),
new TypeToken<List<MessageImpl>>() {
}.getType()));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.rvChatImagesList.setLayoutManager(linearLayoutManager);
binding.rvChatImagesList.setAdapter(adapter);
binding.draggableFrame.addListener(new ElasticDragDismissListener() {
@Override
public void onDrag(float elasticOffset, float elasticOffsetPixels, float rawOffset, float rawOffsetPixels) {
}
@Override
public void onDragDismissed() {
isReturning = true;
getParentFragmentManager().setFragmentResult("XD", null);
//getParentFragmentManager().beginTransaction().remove(ImageListFragment.this).commit();
}
});
//getParentFragment().startPostponedEnterTransition();
//binding.rvChatImagesList.scrollToPosition(position);
//adapter.notifyDataSetChanged();
//prepareSharedElementTransition();
}
适配器回收器片段 B:
public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.ViewHolder> {
private List<Message> messages;
private static int messagePosition;
public Fragment fragment;
public ImageListAdapter(int mssagePosition, Fragment fragment) {
ImageListAdapter.messagePosition = messagePosition;
this.fragment = fragment;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(
ItemImageListBinding.inflate(
LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Message message = messages.get(position);
UtilMessages.MediaMessage content = message.getContent(UtilMessages.MediaMessage.class);
FileUtils.Type type = FileUtils.getMimeType(content.url);
holder.bind(position, fragment);
switch (type) {
case IMAGE:
prepareImageHolder(holder, position, content.url);
break;
case VIDEO:
prepareVideoHolder(holder, position, content.url);
break;
case AUDIO:
break;
case CONTACT:
break;
case UNKNOWN:
break;
}
}
private void prepareVideoHolder(ViewHolder holder, int position, String url) {
holder.ibPlayVideo.setVisibility(View.VISIBLE);
Glide.with(holder.itemView).load(new File(url)).into(holder.ivPicture);
}
private void prepareImageHolder(ViewHolder holder, int position, String url) {
holder.ibPlayVideo.setVisibility(View.GONE);
//Glide.with(holder.itemView).load(new File(url)).into(holder.ivPicture);
holder.ivPicture.setImageBitmap(BitmapFactory.decodeFile(url));
//Glide.with(holder.itemView).load(new File(url)).into(holder.ivPicture);
}
@Override
public int getItemCount() {
return messages.size();
}
public void setMessagesList(List<Message> messagesList) {
messages = messagesList;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView ivPicture;
private final ImageButton ibPlayVideo;
public ViewHolder(@NonNull ItemImageListBinding binding) {
super(binding.getRoot());
ivPicture = binding.ivImageViewImage;
ibPlayVideo = binding.ibPlayVideo;
}
public void bind(int position, Fragment fragment) {
if (position == messagePosition) {
ivPicture.setTransitionName("TRANSITION");
ViewCompat.setTransitionName(ivPicture, "TRANSITION");
ivPicture.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ivPicture.getViewTreeObserver().removeOnPreDrawListener(this);
fragment.startPostponedEnterTransition();
return true;
}
});
/*ivPicture.setTransitionName("Image_" + position + "_" + messagePosition);
// ivPicture, "Image_" + position + "_" + messagePosition
ViewCompat.setTransitionName(ivPicture,"Image_" + position + "_" + messagePosition);
ivPicture.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ivPicture.getViewTreeObserver().removeOnPreDrawListener(this);
fragment.startPostponedEnterTransition();
return true;
}
});*/
}
}
}
任何想法?
解决方案
推荐阅读
- python - 创建一个随机整数列表,然后将所有相同的数字放在一起
- reactjs - 我的反应有问题
- c++ - C++ 对象构建函数返回基类类型
- delphi - Delphi如何使用trackbar控制音量
- google-photos - Google Photos API - 我可以访问现有的扩充项吗?
- swift - 如何从 Raspbian 的源代码编译我自己的 Swift 副本
- kubernetes - 在 Kubernetes 中是否有关闭或杀死 pod 的探测?
- c++ - C++ --- getline 和 cin ignore () . 删除输出字符串中的第一个字符
- ms-access - 如何让我的访问表单重新打开到最后一个未绑定的文本框条目?
- ruby-on-rails-4 - 在视图中呈现关联的 ActiveRecord 属性