首页 > 解决方案 > 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;
                }
            });*/
        }
    }
}

任何想法?

标签: androidandroid-fragmentsandroid-recyclerviewandroid-animationshared-element-transition

解决方案


推荐阅读