从 RecyclerView 的过渡看起来很糟糕

Transition from RecyclerView looks bad

在为片段之间的过渡设置动画时,我发现从 为具有 RecyclerView 的片段设置动画时,视图往往会中断。

仔细查看 gif,因为它 第二个(中间)片段移动到第一个和第三个片段。查看 CardView 的一部分是如何被删除的。

有什么方法可以让过渡更顺畅吗?我在 RecyclerView.Adapter 中阅读了一些关于数据绑定的内容以立即绑定数据,但我不知道这是否对这种特殊情况有帮助,因为它正在从 过渡 RecyclerView 片段故障。

主要活动xml:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<include
    android:id="@+id/toolbar"
    layout="@layout/toolbar"/>

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_below="@id/toolbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

任务片段xml:

<FrameLayout>
    <android.support.v7.widget.RecyclerView />
</FrameLayout>

任务适配器:

public class TasksAdapter extends
    RecyclerView.Adapter<TasksAdapter.ViewHolder> {

static class ViewHolder extends RecyclerView.ViewHolder {
    TextView titleTextView;
    TextView subTitle;
    Button messageButton;
    ImageView taskImage;
    TextView taskDescription;
    CardView cv;

    ViewHolder(View itemView) {
        super(itemView);
        cv = (CardView) itemView.findViewById(R.id.cv);
        titleTextView = (TextView) itemView.findViewById(R.id.task_title);
        subTitle = (TextView) itemView.findViewById(R.id.task_subtitle);
        messageButton = (Button) itemView.findViewById(R.id.message_button);
        taskImage = (ImageView) itemView.findViewById(R.id.task_image);
        taskDescription = (TextView) itemView.findViewById(R.id.task_description);
    }
}

private List<Task> mTasks;
// Store the context for easy access
private Context mContext;
private Fragment fragment;


public TasksAdapter(Context context, List<Task> tasks) {
    mTasks = tasks;
    mContext = context;

}

private Context getContext() {
    return mContext;
}

@Override
public TasksAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    // Inflate the custom layout
    View taskView = inflater.inflate(R.layout.tasks_item, parent, false);

    // Return a new holder instance
    ViewHolder viewHolder = new ViewHolder(taskView);
    return viewHolder;
}

@Override
public void onBindViewHolder(final TasksAdapter.ViewHolder viewHolder, final int position) {
    // Get the data model based on position
    Task task = mTasks.get(position);

    // Set item views based on views and data model
    TextView textView = viewHolder.titleTextView;
    textView.setText(task.getTitle());
    TextView subTitleTextView = viewHolder.subTitle;
    subTitleTextView.setText(task.getSubTitle());
    ImageView imageView = viewHolder.taskImage;
    imageView.setImageResource(task.getImage());
    TextView taskDescriptionTextView = viewHolder.taskDescription;
    taskDescriptionTextView.setText(task.getDescription());
    Button button = viewHolder.messageButton;
    button.setText(task.getAction());
}

通过在 MainActivity 的 FrameLayout 中将设置 android:layout_height 添加到 fill_parent 来解决它。

像这样:

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_below="@id/toolbar"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"/>