使用 Transition Manager 的文本淡入不适用于 RecyclerView

Text fade-in with Transition Manager not working with RecyclerView

我有一个包含 recyclerview 的片段,当我点击一个项目时,我希望其中的文本视图淡出,以便场景过渡到 Activity。当我点击后退按钮返回片段时,recyclerview 项目中的文本应该淡入。问题是这只适用于 recyclerview 中的第一个项目。对于任何其他项目,当我移回片段时,文本会淡出但保持不可见。

在 Adapter 的 onBindViewHolder 中调用 toggleVisibility 方法:

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String imageTransitionName = context.getString(R.string.timeline_item_transition_image);

                Pair imagePair = new Pair<>(view.findViewById(R.id.timeline_image_framelayout), imageTransitionName);

                ActivityOptionsCompat optionsCompat =
                        ActivityOptionsCompat.makeSceneTransitionAnimation(mUpcomingEventsFragment.getActivity(),
                        imagePair);
                toggleVisibility(holder.itemView, false);

                view.getContext().startActivity(EventDetailActivity.newIntent(context,
                        (Event) mTimelineItemList.get(holder.getAdapterPosition())), optionsCompat.toBundle());

            }
        });

以及 TransitionManager 淡入淡出的方法:

public void toggleVisibility(View view, boolean visible) {
    TransitionManager.beginDelayedTransition((ViewGroup) view, new Fade());
    TextView timeText = (TextView) view.findViewById(R.id.event_time);
    TextView titleText = (TextView) view.findViewById(R.id.event_title);
    timeText.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
    titleText.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}

我在片段恢复时调用 toggleVisibility 方法,mUpcomingEventsAdapter.toggleVisibility(mRecyclerView, true); 但我的问题是我不确定如何在 recyclerview 中正确设置所选项目的可见性我回到片段。

Recycler View 包含多个视图,它们的文本视图都具有相同的 ID(Recycler 视图在每个项目上重复使用该视图)。这就是为什么当您尝试更改它时,它只会更改一个视图的可见性。

你可以这样做:

向您的适配器添加一个 toggleAllVisibilities 方法:

public void toggleAllVisibilities(boolean visible) {
    this.visible = visible;
    this.notifyDataSetChanged();
}

notifyDatasetChanged() 方法告诉 recyclerview-Adapter,包含的数据已更改,它应该为每个项目调用 onBindViewHolder。 visible 应该是您适配器中的全局变量。

现在您可以使用原始的 toggleVisibility 方法在 onBindViewholder 中设置每个项目的可见性。 toggleVisibility(holder.itemView, 可见);